diff options
author | MW | 2007-05-21 16:06:58 +0000 |
---|---|---|
committer | MW | 2007-05-21 16:06:58 +0000 |
commit | fe46b045f75dec5ecdd0a29273c70df3e6ea540e (patch) | |
tree | 554c0fb47e513fc6a89f496d99b7b67de24edde7 /OpenSim.RegionServer | |
parent | Increased version number to 0.2! ZOMG! (diff) | |
download | opensim-SC_OLD-fe46b045f75dec5ecdd0a29273c70df3e6ea540e.zip opensim-SC_OLD-fe46b045f75dec5ecdd0a29273c70df3e6ea540e.tar.gz opensim-SC_OLD-fe46b045f75dec5ecdd0a29273c70df3e6ea540e.tar.bz2 opensim-SC_OLD-fe46b045f75dec5ecdd0a29273c70df3e6ea540e.tar.xz |
Start of a redesign of SimClient (now renamed ClientView)/World/Avatar/Prim , switching to a event based system (World/Avatar register as event handlers). It is possible that I've broke something with this commit but it doesn't matter as I'll just hide and no one will find me.
Diffstat (limited to '')
21 files changed, 561 insertions, 522 deletions
diff --git a/OpenSim.RegionServer/AgentAssetUpload.cs b/OpenSim.RegionServer/AgentAssetUpload.cs index cdf49c5..dd2b2a9 100644 --- a/OpenSim.RegionServer/AgentAssetUpload.cs +++ b/OpenSim.RegionServer/AgentAssetUpload.cs | |||
@@ -12,11 +12,11 @@ namespace OpenSim | |||
12 | public class AgentAssetUpload | 12 | public class AgentAssetUpload |
13 | { | 13 | { |
14 | private Dictionary<LLUUID, AssetTransaction> transactions = new Dictionary<LLUUID, AssetTransaction>(); | 14 | private Dictionary<LLUUID, AssetTransaction> transactions = new Dictionary<LLUUID, AssetTransaction>(); |
15 | private SimClient ourClient; | 15 | private ClientView ourClient; |
16 | private AssetCache m_assetCache; | 16 | private AssetCache m_assetCache; |
17 | private InventoryCache m_inventoryCache; | 17 | private InventoryCache m_inventoryCache; |
18 | 18 | ||
19 | public AgentAssetUpload(SimClient client, AssetCache assetCache, InventoryCache inventoryCache) | 19 | public AgentAssetUpload(ClientView client, AssetCache assetCache, InventoryCache inventoryCache) |
20 | { | 20 | { |
21 | this.ourClient = client; | 21 | this.ourClient = client; |
22 | m_assetCache = assetCache; | 22 | m_assetCache = assetCache; |
diff --git a/OpenSim.RegionServer/Assets/AssetCache.cs b/OpenSim.RegionServer/Assets/AssetCache.cs index e8bf292..ccebb24 100644 --- a/OpenSim.RegionServer/Assets/AssetCache.cs +++ b/OpenSim.RegionServer/Assets/AssetCache.cs | |||
@@ -324,7 +324,7 @@ namespace OpenSim.Assets | |||
324 | /// </summary> | 324 | /// </summary> |
325 | /// <param name="userInfo"></param> | 325 | /// <param name="userInfo"></param> |
326 | /// <param name="transferRequest"></param> | 326 | /// <param name="transferRequest"></param> |
327 | public void AddAssetRequest(SimClient userInfo, TransferRequestPacket transferRequest) | 327 | public void AddAssetRequest(ClientView userInfo, TransferRequestPacket transferRequest) |
328 | { | 328 | { |
329 | LLUUID requestID = new LLUUID(transferRequest.TransferInfo.Params, 0); | 329 | LLUUID requestID = new LLUUID(transferRequest.TransferInfo.Params, 0); |
330 | //check to see if asset is in local cache, if not we need to request it from asset server. | 330 | //check to see if asset is in local cache, if not we need to request it from asset server. |
@@ -464,7 +464,7 @@ namespace OpenSim.Assets | |||
464 | /// </summary> | 464 | /// </summary> |
465 | /// <param name="userInfo"></param> | 465 | /// <param name="userInfo"></param> |
466 | /// <param name="imageID"></param> | 466 | /// <param name="imageID"></param> |
467 | public void AddTextureRequest(SimClient userInfo, LLUUID imageID) | 467 | public void AddTextureRequest(ClientView userInfo, LLUUID imageID) |
468 | { | 468 | { |
469 | //check to see if texture is in local cache, if not request from asset server | 469 | //check to see if texture is in local cache, if not request from asset server |
470 | if (!this.Textures.ContainsKey(imageID)) | 470 | if (!this.Textures.ContainsKey(imageID)) |
@@ -517,7 +517,7 @@ namespace OpenSim.Assets | |||
517 | 517 | ||
518 | public class AssetRequest | 518 | public class AssetRequest |
519 | { | 519 | { |
520 | public SimClient RequestUser; | 520 | public ClientView RequestUser; |
521 | public LLUUID RequestAssetID; | 521 | public LLUUID RequestAssetID; |
522 | public AssetInfo AssetInf; | 522 | public AssetInfo AssetInf; |
523 | public TextureImage ImageInfo; | 523 | public TextureImage ImageInfo; |
diff --git a/OpenSim.RegionServer/Assets/InventoryCache.cs b/OpenSim.RegionServer/Assets/InventoryCache.cs index 136ae53..64a7a32 100644 --- a/OpenSim.RegionServer/Assets/InventoryCache.cs +++ b/OpenSim.RegionServer/Assets/InventoryCache.cs | |||
@@ -94,12 +94,12 @@ namespace OpenSim.Assets | |||
94 | } | 94 | } |
95 | } | 95 | } |
96 | 96 | ||
97 | public bool CreateNewInventoryFolder(SimClient remoteClient, LLUUID folderID) | 97 | public bool CreateNewInventoryFolder(ClientView remoteClient, LLUUID folderID) |
98 | { | 98 | { |
99 | return this.CreateNewInventoryFolder(remoteClient, folderID, 0); | 99 | return this.CreateNewInventoryFolder(remoteClient, folderID, 0); |
100 | } | 100 | } |
101 | 101 | ||
102 | public bool CreateNewInventoryFolder(SimClient remoteClient, LLUUID folderID, ushort type) | 102 | public bool CreateNewInventoryFolder(ClientView remoteClient, LLUUID folderID, ushort type) |
103 | { | 103 | { |
104 | bool res = false; | 104 | bool res = false; |
105 | if (folderID != LLUUID.Zero) //don't create a folder with a zero id | 105 | if (folderID != LLUUID.Zero) //don't create a folder with a zero id |
@@ -112,7 +112,7 @@ namespace OpenSim.Assets | |||
112 | return res; | 112 | return res; |
113 | } | 113 | } |
114 | 114 | ||
115 | public bool CreateNewInventoryFolder(SimClient remoteClient, LLUUID folderID, ushort type, string folderName, LLUUID parent) | 115 | public bool CreateNewInventoryFolder(ClientView remoteClient, LLUUID folderID, ushort type, string folderName, LLUUID parent) |
116 | { | 116 | { |
117 | bool res = false; | 117 | bool res = false; |
118 | if (folderID != LLUUID.Zero) //don't create a folder with a zero id | 118 | if (folderID != LLUUID.Zero) //don't create a folder with a zero id |
@@ -125,7 +125,7 @@ namespace OpenSim.Assets | |||
125 | return res; | 125 | return res; |
126 | } | 126 | } |
127 | 127 | ||
128 | public LLUUID AddNewInventoryItem(SimClient remoteClient, LLUUID folderID, OpenSim.Framework.Types.AssetBase asset) | 128 | public LLUUID AddNewInventoryItem(ClientView remoteClient, LLUUID folderID, OpenSim.Framework.Types.AssetBase asset) |
129 | { | 129 | { |
130 | LLUUID newItem = null; | 130 | LLUUID newItem = null; |
131 | if (this._agentsInventory.ContainsKey(remoteClient.AgentID)) | 131 | if (this._agentsInventory.ContainsKey(remoteClient.AgentID)) |
@@ -140,7 +140,7 @@ namespace OpenSim.Assets | |||
140 | 140 | ||
141 | return newItem; | 141 | return newItem; |
142 | } | 142 | } |
143 | public bool DeleteInventoryItem(SimClient remoteClient, LLUUID itemID) | 143 | public bool DeleteInventoryItem(ClientView remoteClient, LLUUID itemID) |
144 | { | 144 | { |
145 | bool res = false; | 145 | bool res = false; |
146 | if (this._agentsInventory.ContainsKey(remoteClient.AgentID)) | 146 | if (this._agentsInventory.ContainsKey(remoteClient.AgentID)) |
@@ -161,7 +161,7 @@ namespace OpenSim.Assets | |||
161 | return res; | 161 | return res; |
162 | } | 162 | } |
163 | 163 | ||
164 | public bool UpdateInventoryItemAsset(SimClient remoteClient, LLUUID itemID, OpenSim.Framework.Types.AssetBase asset) | 164 | public bool UpdateInventoryItemAsset(ClientView remoteClient, LLUUID itemID, OpenSim.Framework.Types.AssetBase asset) |
165 | { | 165 | { |
166 | if (this._agentsInventory.ContainsKey(remoteClient.AgentID)) | 166 | if (this._agentsInventory.ContainsKey(remoteClient.AgentID)) |
167 | { | 167 | { |
@@ -177,7 +177,7 @@ namespace OpenSim.Assets | |||
177 | return false; | 177 | return false; |
178 | } | 178 | } |
179 | 179 | ||
180 | public bool UpdateInventoryItemDetails(SimClient remoteClient, LLUUID itemID, UpdateInventoryItemPacket.InventoryDataBlock packet) | 180 | public bool UpdateInventoryItemDetails(ClientView remoteClient, LLUUID itemID, UpdateInventoryItemPacket.InventoryDataBlock packet) |
181 | { | 181 | { |
182 | if (this._agentsInventory.ContainsKey(remoteClient.AgentID)) | 182 | if (this._agentsInventory.ContainsKey(remoteClient.AgentID)) |
183 | { | 183 | { |
@@ -193,7 +193,7 @@ namespace OpenSim.Assets | |||
193 | return false; | 193 | return false; |
194 | } | 194 | } |
195 | 195 | ||
196 | public void FetchInventoryDescendents(SimClient userInfo, FetchInventoryDescendentsPacket FetchDescend) | 196 | public void FetchInventoryDescendents(ClientView userInfo, FetchInventoryDescendentsPacket FetchDescend) |
197 | { | 197 | { |
198 | if (this._agentsInventory.ContainsKey(userInfo.AgentID)) | 198 | if (this._agentsInventory.ContainsKey(userInfo.AgentID)) |
199 | { | 199 | { |
@@ -250,7 +250,7 @@ namespace OpenSim.Assets | |||
250 | } | 250 | } |
251 | } | 251 | } |
252 | 252 | ||
253 | public void FetchInventory(SimClient userInfo, FetchInventoryPacket FetchItems) | 253 | public void FetchInventory(ClientView userInfo, FetchInventoryPacket FetchItems) |
254 | { | 254 | { |
255 | if (this._agentsInventory.ContainsKey(userInfo.AgentID)) | 255 | if (this._agentsInventory.ContainsKey(userInfo.AgentID)) |
256 | { | 256 | { |
@@ -291,7 +291,7 @@ namespace OpenSim.Assets | |||
291 | } | 291 | } |
292 | } | 292 | } |
293 | 293 | ||
294 | private void SendItemUpdateCreate(SimClient remoteClient, InventoryItem Item) | 294 | private void SendItemUpdateCreate(ClientView remoteClient, InventoryItem Item) |
295 | { | 295 | { |
296 | 296 | ||
297 | UpdateCreateInventoryItemPacket InventoryReply = new UpdateCreateInventoryItemPacket(); | 297 | UpdateCreateInventoryItemPacket InventoryReply = new UpdateCreateInventoryItemPacket(); |
diff --git a/OpenSim.RegionServer/SimClient.Grid.cs b/OpenSim.RegionServer/ClientView.Grid.cs index 493d4d7..a3b191c 100644 --- a/OpenSim.RegionServer/SimClient.Grid.cs +++ b/OpenSim.RegionServer/ClientView.Grid.cs | |||
@@ -18,7 +18,7 @@ using OpenSim.Assets; | |||
18 | 18 | ||
19 | namespace OpenSim | 19 | namespace OpenSim |
20 | { | 20 | { |
21 | public partial class SimClient | 21 | public partial class ClientView |
22 | { | 22 | { |
23 | 23 | ||
24 | public void EnableNeighbours() | 24 | public void EnableNeighbours() |
diff --git a/OpenSim.RegionServer/SimClient.PacketHandlers.cs b/OpenSim.RegionServer/ClientView.PacketHandlers.cs index 62919ba..070c200 100644 --- a/OpenSim.RegionServer/SimClient.PacketHandlers.cs +++ b/OpenSim.RegionServer/ClientView.PacketHandlers.cs | |||
@@ -18,7 +18,7 @@ using OpenSim.Assets; | |||
18 | 18 | ||
19 | namespace OpenSim | 19 | namespace OpenSim |
20 | { | 20 | { |
21 | public partial class SimClient | 21 | public partial class ClientView |
22 | { | 22 | { |
23 | protected virtual void RegisterLocalPacketHandlers() | 23 | protected virtual void RegisterLocalPacketHandlers() |
24 | { | 24 | { |
@@ -27,7 +27,7 @@ namespace OpenSim | |||
27 | this.AddLocalPacketHandler(PacketType.MultipleObjectUpdate, this.MultipleObjUpdate); | 27 | this.AddLocalPacketHandler(PacketType.MultipleObjectUpdate, this.MultipleObjUpdate); |
28 | } | 28 | } |
29 | 29 | ||
30 | protected virtual bool Logout(SimClient simClient, Packet packet) | 30 | protected virtual bool Logout(ClientView simClient, Packet packet) |
31 | { | 31 | { |
32 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.LOW, "OpenSimClient.cs:ProcessInPacket() - Got a logout request"); | 32 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.LOW, "OpenSimClient.cs:ProcessInPacket() - Got a logout request"); |
33 | //send reply to let the client logout | 33 | //send reply to let the client logout |
@@ -43,7 +43,7 @@ namespace OpenSim | |||
43 | kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1]; | 43 | kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1]; |
44 | kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock(); | 44 | kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock(); |
45 | kill.ObjectData[0].ID = this.ClientAvatar.localid; | 45 | kill.ObjectData[0].ID = this.ClientAvatar.localid; |
46 | foreach (SimClient client in m_clientThreads.Values) | 46 | foreach (ClientView client in m_clientThreads.Values) |
47 | { | 47 | { |
48 | client.OutPacket(kill); | 48 | client.OutPacket(kill); |
49 | } | 49 | } |
@@ -69,7 +69,7 @@ namespace OpenSim | |||
69 | return true; | 69 | return true; |
70 | } | 70 | } |
71 | 71 | ||
72 | protected bool AgentTextureCached(SimClient simclient, Packet packet) | 72 | protected bool AgentTextureCached(ClientView simclient, Packet packet) |
73 | { | 73 | { |
74 | // Console.WriteLine(packet.ToString()); | 74 | // Console.WriteLine(packet.ToString()); |
75 | AgentCachedTexturePacket chechedtex = (AgentCachedTexturePacket)packet; | 75 | AgentCachedTexturePacket chechedtex = (AgentCachedTexturePacket)packet; |
@@ -90,7 +90,7 @@ namespace OpenSim | |||
90 | return true; | 90 | return true; |
91 | } | 91 | } |
92 | 92 | ||
93 | protected bool MultipleObjUpdate(SimClient simClient, Packet packet) | 93 | protected bool MultipleObjUpdate(ClientView simClient, Packet packet) |
94 | { | 94 | { |
95 | MultipleObjectUpdatePacket multipleupdate = (MultipleObjectUpdatePacket)packet; | 95 | MultipleObjectUpdatePacket multipleupdate = (MultipleObjectUpdatePacket)packet; |
96 | for (int i = 0; i < multipleupdate.ObjectData.Length; i++) | 96 | for (int i = 0; i < multipleupdate.ObjectData.Length; i++) |
diff --git a/OpenSim.RegionServer/SimClient.ProcessPackets.cs b/OpenSim.RegionServer/ClientView.ProcessPackets.cs index c9592c2..0079d96 100644 --- a/OpenSim.RegionServer/SimClient.ProcessPackets.cs +++ b/OpenSim.RegionServer/ClientView.ProcessPackets.cs | |||
@@ -18,9 +18,14 @@ using OpenSim.Assets; | |||
18 | 18 | ||
19 | namespace OpenSim | 19 | namespace OpenSim |
20 | { | 20 | { |
21 | public partial class SimClient | 21 | public partial class ClientView |
22 | { | 22 | { |
23 | protected virtual void ProcessInPacket(Packet Pack) | 23 | public delegate void ChatFromViewer(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID); |
24 | |||
25 | |||
26 | public event ChatFromViewer OnChatFromViewer; | ||
27 | |||
28 | protected override void ProcessInPacket(Packet Pack) | ||
24 | { | 29 | { |
25 | ack_pack(Pack); | 30 | ack_pack(Pack); |
26 | if (debug) | 31 | if (debug) |
@@ -42,6 +47,24 @@ namespace OpenSim | |||
42 | 47 | ||
43 | switch (Pack.Type) | 48 | switch (Pack.Type) |
44 | { | 49 | { |
50 | #region New Event system | ||
51 | case PacketType.ChatFromViewer: | ||
52 | ChatFromViewerPacket inchatpack = (ChatFromViewerPacket)Pack; | ||
53 | if (Util.FieldToString(inchatpack.ChatData.Message) == "") | ||
54 | { | ||
55 | //empty message so don't bother with it | ||
56 | break; | ||
57 | } | ||
58 | string fromName = ClientAvatar.firstname + " " + ClientAvatar.lastname; | ||
59 | byte[] message = inchatpack.ChatData.Message; | ||
60 | byte type = inchatpack.ChatData.Type; | ||
61 | LLVector3 fromPos = ClientAvatar.Pos; | ||
62 | LLUUID fromAgentID = AgentID; | ||
63 | this.OnChatFromViewer(message, type, fromPos, fromName, fromAgentID); | ||
64 | break; | ||
65 | #endregion | ||
66 | |||
67 | #region World/Avatar/Primitive related packets | ||
45 | case PacketType.CompleteAgentMovement: | 68 | case PacketType.CompleteAgentMovement: |
46 | if (this.m_child) this.UpgradeClient(); | 69 | if (this.m_child) this.UpgradeClient(); |
47 | ClientAvatar.CompleteMovement(m_world); | 70 | ClientAvatar.CompleteMovement(m_world); |
@@ -53,13 +76,13 @@ namespace OpenSim | |||
53 | break; | 76 | break; |
54 | case PacketType.AgentWearablesRequest: | 77 | case PacketType.AgentWearablesRequest: |
55 | ClientAvatar.SendInitialAppearance(); | 78 | ClientAvatar.SendInitialAppearance(); |
56 | foreach (SimClient client in m_clientThreads.Values) | 79 | foreach (ClientView client in m_clientThreads.Values) |
57 | { | 80 | { |
58 | if (client.AgentID != this.AgentID) | 81 | if (client.AgentID != this.AgentID) |
59 | { | 82 | { |
60 | ObjectUpdatePacket objupdate = client.ClientAvatar.CreateUpdatePacket(); | 83 | ObjectUpdatePacket objupdate = client.ClientAvatar.CreateUpdatePacket(); |
61 | this.OutPacket(objupdate); | 84 | this.OutPacket(objupdate); |
62 | client.ClientAvatar.SendAppearanceToOtherAgent(this); | 85 | client.ClientAvatar.SendAppearanceToOtherAgent(this.ClientAvatar); |
63 | } | 86 | } |
64 | } | 87 | } |
65 | m_world.GetInitialPrims(this); | 88 | m_world.GetInitialPrims(this); |
@@ -120,18 +143,6 @@ namespace OpenSim | |||
120 | } | 143 | } |
121 | } | 144 | } |
122 | break; | 145 | break; |
123 | case PacketType.RequestImage: | ||
124 | RequestImagePacket imageRequest = (RequestImagePacket)Pack; | ||
125 | for (int i = 0; i < imageRequest.RequestImage.Length; i++) | ||
126 | { | ||
127 | m_assetCache.AddTextureRequest(this, imageRequest.RequestImage[i].Image); | ||
128 | } | ||
129 | break; | ||
130 | case PacketType.TransferRequest: | ||
131 | //Console.WriteLine("OpenSimClient.cs:ProcessInPacket() - Got transfer request"); | ||
132 | TransferRequestPacket transfer = (TransferRequestPacket)Pack; | ||
133 | m_assetCache.AddAssetRequest(this, transfer); | ||
134 | break; | ||
135 | case PacketType.AgentUpdate: | 146 | case PacketType.AgentUpdate: |
136 | ClientAvatar.HandleUpdate((AgentUpdatePacket)Pack); | 147 | ClientAvatar.HandleUpdate((AgentUpdatePacket)Pack); |
137 | break; | 148 | break; |
@@ -158,6 +169,62 @@ namespace OpenSim | |||
158 | } | 169 | } |
159 | } | 170 | } |
160 | break; | 171 | break; |
172 | case PacketType.AgentAnimation: | ||
173 | if (!m_child) | ||
174 | { | ||
175 | AgentAnimationPacket AgentAni = (AgentAnimationPacket)Pack; | ||
176 | for (int i = 0; i < AgentAni.AnimationList.Length; i++) | ||
177 | { | ||
178 | if (AgentAni.AnimationList[i].StartAnim) | ||
179 | { | ||
180 | ClientAvatar.current_anim = AgentAni.AnimationList[i].AnimID; | ||
181 | ClientAvatar.anim_seq = 1; | ||
182 | ClientAvatar.SendAnimPack(); | ||
183 | } | ||
184 | } | ||
185 | } | ||
186 | break; | ||
187 | case PacketType.ObjectSelect: | ||
188 | ObjectSelectPacket incomingselect = (ObjectSelectPacket)Pack; | ||
189 | for (int i = 0; i < incomingselect.ObjectData.Length; i++) | ||
190 | { | ||
191 | foreach (Entity ent in m_world.Entities.Values) | ||
192 | { | ||
193 | if (ent.localid == incomingselect.ObjectData[i].ObjectLocalID) | ||
194 | { | ||
195 | ((OpenSim.world.Primitive)ent).GetProperites(this); | ||
196 | break; | ||
197 | } | ||
198 | } | ||
199 | } | ||
200 | break; | ||
201 | case PacketType.ViewerEffect: | ||
202 | ViewerEffectPacket viewer = (ViewerEffectPacket)Pack; | ||
203 | foreach (ClientView client in m_clientThreads.Values) | ||
204 | { | ||
205 | if (client.AgentID != this.AgentID) | ||
206 | { | ||
207 | viewer.AgentData.AgentID = client.AgentID; | ||
208 | viewer.AgentData.SessionID = client.SessionID; | ||
209 | client.OutPacket(viewer); | ||
210 | } | ||
211 | } | ||
212 | break; | ||
213 | #endregion | ||
214 | |||
215 | #region Inventory/Asset/Other related packets | ||
216 | case PacketType.RequestImage: | ||
217 | RequestImagePacket imageRequest = (RequestImagePacket)Pack; | ||
218 | for (int i = 0; i < imageRequest.RequestImage.Length; i++) | ||
219 | { | ||
220 | m_assetCache.AddTextureRequest(this, imageRequest.RequestImage[i].Image); | ||
221 | } | ||
222 | break; | ||
223 | case PacketType.TransferRequest: | ||
224 | //Console.WriteLine("OpenSimClient.cs:ProcessInPacket() - Got transfer request"); | ||
225 | TransferRequestPacket transfer = (TransferRequestPacket)Pack; | ||
226 | m_assetCache.AddAssetRequest(this, transfer); | ||
227 | break; | ||
161 | case PacketType.AssetUploadRequest: | 228 | case PacketType.AssetUploadRequest: |
162 | AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack; | 229 | AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack; |
163 | this.UploadAssets.HandleUploadPacket(request, request.AssetBlock.TransactionID.Combine(this.SecureSessionID)); | 230 | this.UploadAssets.HandleUploadPacket(request, request.AssetBlock.TransactionID.Combine(this.SecureSessionID)); |
@@ -228,18 +295,6 @@ namespace OpenSim | |||
228 | } | 295 | } |
229 | } | 296 | } |
230 | break; | 297 | break; |
231 | case PacketType.ViewerEffect: | ||
232 | ViewerEffectPacket viewer = (ViewerEffectPacket)Pack; | ||
233 | foreach (SimClient client in m_clientThreads.Values) | ||
234 | { | ||
235 | if (client.AgentID != this.AgentID) | ||
236 | { | ||
237 | viewer.AgentData.AgentID = client.AgentID; | ||
238 | viewer.AgentData.SessionID = client.SessionID; | ||
239 | client.OutPacket(viewer); | ||
240 | } | ||
241 | } | ||
242 | break; | ||
243 | case PacketType.RequestTaskInventory: | 298 | case PacketType.RequestTaskInventory: |
244 | // Console.WriteLine(Pack.ToString()); | 299 | // Console.WriteLine(Pack.ToString()); |
245 | RequestTaskInventoryPacket requesttask = (RequestTaskInventoryPacket)Pack; | 300 | RequestTaskInventoryPacket requesttask = (RequestTaskInventoryPacket)Pack; |
@@ -292,35 +347,6 @@ namespace OpenSim | |||
292 | } | 347 | } |
293 | } | 348 | } |
294 | break; | 349 | break; |
295 | case PacketType.AgentAnimation: | ||
296 | if (!m_child) | ||
297 | { | ||
298 | AgentAnimationPacket AgentAni = (AgentAnimationPacket)Pack; | ||
299 | for (int i = 0; i < AgentAni.AnimationList.Length; i++) | ||
300 | { | ||
301 | if (AgentAni.AnimationList[i].StartAnim) | ||
302 | { | ||
303 | ClientAvatar.current_anim = AgentAni.AnimationList[i].AnimID; | ||
304 | ClientAvatar.anim_seq = 1; | ||
305 | ClientAvatar.SendAnimPack(); | ||
306 | } | ||
307 | } | ||
308 | } | ||
309 | break; | ||
310 | case PacketType.ObjectSelect: | ||
311 | ObjectSelectPacket incomingselect = (ObjectSelectPacket)Pack; | ||
312 | for (int i = 0; i < incomingselect.ObjectData.Length; i++) | ||
313 | { | ||
314 | foreach (Entity ent in m_world.Entities.Values) | ||
315 | { | ||
316 | if (ent.localid == incomingselect.ObjectData[i].ObjectLocalID) | ||
317 | { | ||
318 | ((OpenSim.world.Primitive)ent).GetProperites(this); | ||
319 | break; | ||
320 | } | ||
321 | } | ||
322 | } | ||
323 | break; | ||
324 | case PacketType.MapLayerRequest: | 350 | case PacketType.MapLayerRequest: |
325 | this.RequestMapLayer(); | 351 | this.RequestMapLayer(); |
326 | break; | 352 | break; |
@@ -329,7 +355,6 @@ namespace OpenSim | |||
329 | 355 | ||
330 | this.RequestMapBlocks(MapRequest.PositionData.MinX, MapRequest.PositionData.MinY, MapRequest.PositionData.MaxX, MapRequest.PositionData.MaxY); | 356 | this.RequestMapBlocks(MapRequest.PositionData.MinX, MapRequest.PositionData.MinY, MapRequest.PositionData.MaxX, MapRequest.PositionData.MaxY); |
331 | break; | 357 | break; |
332 | |||
333 | case PacketType.TeleportLandmarkRequest: | 358 | case PacketType.TeleportLandmarkRequest: |
334 | TeleportLandmarkRequestPacket tpReq = (TeleportLandmarkRequestPacket)Pack; | 359 | TeleportLandmarkRequestPacket tpReq = (TeleportLandmarkRequestPacket)Pack; |
335 | 360 | ||
@@ -378,7 +403,6 @@ namespace OpenSim | |||
378 | OutPacket(tpCancel); | 403 | OutPacket(tpCancel); |
379 | } | 404 | } |
380 | break; | 405 | break; |
381 | |||
382 | case PacketType.TeleportLocationRequest: | 406 | case PacketType.TeleportLocationRequest: |
383 | TeleportLocationRequestPacket tpLocReq = (TeleportLocationRequestPacket)Pack; | 407 | TeleportLocationRequestPacket tpLocReq = (TeleportLocationRequestPacket)Pack; |
384 | Console.WriteLine(tpLocReq.ToString()); | 408 | Console.WriteLine(tpLocReq.ToString()); |
@@ -410,8 +434,8 @@ namespace OpenSim | |||
410 | OutPacket(tpLocal); | 434 | OutPacket(tpLocal); |
411 | 435 | ||
412 | } | 436 | } |
413 | |||
414 | break; | 437 | break; |
438 | #endregion | ||
415 | } | 439 | } |
416 | } | 440 | } |
417 | } | 441 | } |
diff --git a/OpenSim.RegionServer/SimClient.cs b/OpenSim.RegionServer/ClientView.cs index 3b243cf..a97049d 100644 --- a/OpenSim.RegionServer/SimClient.cs +++ b/OpenSim.RegionServer/ClientView.cs | |||
@@ -44,43 +44,31 @@ using OpenSim.Assets; | |||
44 | 44 | ||
45 | namespace OpenSim | 45 | namespace OpenSim |
46 | { | 46 | { |
47 | public delegate bool PacketMethod(SimClient simClient, Packet packet); | 47 | public delegate bool PacketMethod(ClientView simClient, Packet packet); |
48 | 48 | ||
49 | /// <summary> | 49 | /// <summary> |
50 | /// Handles new client connections | 50 | /// Handles new client connections |
51 | /// Constructor takes a single Packet and authenticates everything | 51 | /// Constructor takes a single Packet and authenticates everything |
52 | /// </summary> | 52 | /// </summary> |
53 | public partial class SimClient | 53 | public partial class ClientView : ClientViewBase |
54 | { | 54 | { |
55 | public LLUUID AgentID; | 55 | public LLUUID AgentID; |
56 | public LLUUID SessionID; | 56 | public LLUUID SessionID; |
57 | public LLUUID SecureSessionID = LLUUID.Zero; | 57 | public LLUUID SecureSessionID = LLUUID.Zero; |
58 | public bool m_child; | 58 | public bool m_child; |
59 | public uint CircuitCode; | ||
60 | public world.Avatar ClientAvatar; | 59 | public world.Avatar ClientAvatar; |
61 | private UseCircuitCodePacket cirpack; | 60 | private UseCircuitCodePacket cirpack; |
62 | public Thread ClientThread; | 61 | public Thread ClientThread; |
63 | public EndPoint userEP; | ||
64 | public LLVector3 startpos; | 62 | public LLVector3 startpos; |
65 | private BlockingQueue<QueItem> PacketQueue; | 63 | |
66 | private Dictionary<uint, uint> PendingAcks = new Dictionary<uint, uint>(); | ||
67 | private Dictionary<uint, Packet> NeedAck = new Dictionary<uint, Packet>(); | ||
68 | //private Dictionary<LLUUID, AssetBase> UploadedAssets = new Dictionary<LLUUID, AssetBase>(); | ||
69 | private System.Timers.Timer AckTimer; | ||
70 | private uint Sequence = 0; | ||
71 | private object SequenceLock = new object(); | ||
72 | private const int MAX_APPENDED_ACKS = 10; | ||
73 | private const int RESEND_TIMEOUT = 4000; | ||
74 | private const int MAX_SEQUENCE = 0xFFFFFF; | ||
75 | private AgentAssetUpload UploadAssets; | 64 | private AgentAssetUpload UploadAssets; |
76 | private LLUUID newAssetFolder = LLUUID.Zero; | 65 | private LLUUID newAssetFolder = LLUUID.Zero; |
77 | private bool debug = false; | 66 | private bool debug = false; |
78 | private World m_world; | 67 | private World m_world; |
79 | private Dictionary<uint, SimClient> m_clientThreads; | 68 | private Dictionary<uint, ClientView> m_clientThreads; |
80 | private AssetCache m_assetCache; | 69 | private AssetCache m_assetCache; |
81 | private IGridServer m_gridServer; | 70 | private IGridServer m_gridServer; |
82 | private IUserServer m_userServer = null; | 71 | private IUserServer m_userServer = null; |
83 | private OpenSimNetworkHandler m_networkServer; | ||
84 | private InventoryCache m_inventoryCache; | 72 | private InventoryCache m_inventoryCache; |
85 | public bool m_sandboxMode; | 73 | public bool m_sandboxMode; |
86 | private int cachedtextureserial = 0; | 74 | private int cachedtextureserial = 0; |
@@ -99,7 +87,7 @@ namespace OpenSim | |||
99 | } | 87 | } |
100 | } | 88 | } |
101 | 89 | ||
102 | public SimClient(EndPoint remoteEP, UseCircuitCodePacket initialcirpack, World world, Dictionary<uint, SimClient> clientThreads, AssetCache assetCache, IGridServer gridServer, OpenSimNetworkHandler application, InventoryCache inventoryCache, bool sandboxMode, bool child, RegionInfo regionDat, AuthenticateSessionsBase authenSessions) | 90 | public ClientView(EndPoint remoteEP, UseCircuitCodePacket initialcirpack, World world, Dictionary<uint, ClientView> clientThreads, AssetCache assetCache, IGridServer gridServer, OpenSimNetworkHandler application, InventoryCache inventoryCache, bool sandboxMode, bool child, RegionInfo regionDat, AuthenticateSessionsBase authenSessions) |
103 | { | 91 | { |
104 | m_world = world; | 92 | m_world = world; |
105 | m_clientThreads = clientThreads; | 93 | m_clientThreads = clientThreads; |
@@ -170,7 +158,7 @@ namespace OpenSim | |||
170 | kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1]; | 158 | kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1]; |
171 | kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock(); | 159 | kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock(); |
172 | kill.ObjectData[0].ID = this.ClientAvatar.localid; | 160 | kill.ObjectData[0].ID = this.ClientAvatar.localid; |
173 | foreach (SimClient client in m_clientThreads.Values) | 161 | foreach (ClientView client in m_clientThreads.Values) |
174 | { | 162 | { |
175 | client.OutPacket(kill); | 163 | client.OutPacket(kill); |
176 | } | 164 | } |
@@ -247,246 +235,6 @@ namespace OpenSim | |||
247 | 235 | ||
248 | # endregion | 236 | # endregion |
249 | 237 | ||
250 | # region Low Level Packet Methods | ||
251 | |||
252 | private void ack_pack(Packet Pack) | ||
253 | { | ||
254 | if (Pack.Header.Reliable) | ||
255 | { | ||
256 | libsecondlife.Packets.PacketAckPacket ack_it = new PacketAckPacket(); | ||
257 | ack_it.Packets = new PacketAckPacket.PacketsBlock[1]; | ||
258 | ack_it.Packets[0] = new PacketAckPacket.PacketsBlock(); | ||
259 | ack_it.Packets[0].ID = Pack.Header.Sequence; | ||
260 | ack_it.Header.Reliable = false; | ||
261 | |||
262 | OutPacket(ack_it); | ||
263 | |||
264 | } | ||
265 | /* | ||
266 | if (Pack.Header.Reliable) | ||
267 | { | ||
268 | lock (PendingAcks) | ||
269 | { | ||
270 | uint sequence = (uint)Pack.Header.Sequence; | ||
271 | if (!PendingAcks.ContainsKey(sequence)) { PendingAcks[sequence] = sequence; } | ||
272 | } | ||
273 | }*/ | ||
274 | } | ||
275 | |||
276 | private void ResendUnacked() | ||
277 | { | ||
278 | int now = Environment.TickCount; | ||
279 | |||
280 | lock (NeedAck) | ||
281 | { | ||
282 | foreach (Packet packet in NeedAck.Values) | ||
283 | { | ||
284 | if ((now - packet.TickCount > RESEND_TIMEOUT) && (!packet.Header.Resent)) | ||
285 | { | ||
286 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.VERBOSE, "Resending " + packet.Type.ToString() + " packet, " + | ||
287 | (now - packet.TickCount) + "ms have passed"); | ||
288 | |||
289 | packet.Header.Resent = true; | ||
290 | OutPacket(packet); | ||
291 | } | ||
292 | } | ||
293 | } | ||
294 | } | ||
295 | |||
296 | private void SendAcks() | ||
297 | { | ||
298 | lock (PendingAcks) | ||
299 | { | ||
300 | if (PendingAcks.Count > 0) | ||
301 | { | ||
302 | if (PendingAcks.Count > 250) | ||
303 | { | ||
304 | // FIXME: Handle the odd case where we have too many pending ACKs queued up | ||
305 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.VERBOSE, "Too many ACKs queued up!"); | ||
306 | return; | ||
307 | } | ||
308 | |||
309 | //OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Sending PacketAck"); | ||
310 | |||
311 | |||
312 | int i = 0; | ||
313 | PacketAckPacket acks = new PacketAckPacket(); | ||
314 | acks.Packets = new PacketAckPacket.PacketsBlock[PendingAcks.Count]; | ||
315 | |||
316 | foreach (uint ack in PendingAcks.Values) | ||
317 | { | ||
318 | acks.Packets[i] = new PacketAckPacket.PacketsBlock(); | ||
319 | acks.Packets[i].ID = ack; | ||
320 | i++; | ||
321 | } | ||
322 | |||
323 | acks.Header.Reliable = false; | ||
324 | OutPacket(acks); | ||
325 | |||
326 | PendingAcks.Clear(); | ||
327 | } | ||
328 | } | ||
329 | } | ||
330 | |||
331 | private void AckTimer_Elapsed(object sender, ElapsedEventArgs ea) | ||
332 | { | ||
333 | SendAcks(); | ||
334 | ResendUnacked(); | ||
335 | } | ||
336 | |||
337 | # endregion | ||
338 | |||
339 | #region Packet Queue Processing | ||
340 | |||
341 | protected virtual void ProcessOutPacket(Packet Pack) | ||
342 | { | ||
343 | // Keep track of when this packet was sent out | ||
344 | Pack.TickCount = Environment.TickCount; | ||
345 | |||
346 | if (!Pack.Header.Resent) | ||
347 | { | ||
348 | // Set the sequence number | ||
349 | lock (SequenceLock) | ||
350 | { | ||
351 | if (Sequence >= MAX_SEQUENCE) | ||
352 | Sequence = 1; | ||
353 | else | ||
354 | Sequence++; | ||
355 | Pack.Header.Sequence = Sequence; | ||
356 | } | ||
357 | |||
358 | if (Pack.Header.Reliable) //DIRTY HACK | ||
359 | { | ||
360 | lock (NeedAck) | ||
361 | { | ||
362 | if (!NeedAck.ContainsKey(Pack.Header.Sequence)) | ||
363 | { | ||
364 | try | ||
365 | { | ||
366 | NeedAck.Add(Pack.Header.Sequence, Pack); | ||
367 | } | ||
368 | catch (Exception e) // HACKY | ||
369 | { | ||
370 | e.ToString(); | ||
371 | // Ignore | ||
372 | // Seems to throw a exception here occasionally | ||
373 | // of 'duplicate key' despite being locked. | ||
374 | // !?!?!? | ||
375 | } | ||
376 | } | ||
377 | else | ||
378 | { | ||
379 | // Client.Log("Attempted to add a duplicate sequence number (" + | ||
380 | // packet.Header.Sequence + ") to the NeedAck dictionary for packet type " + | ||
381 | // packet.Type.ToString(), Helpers.LogLevel.Warning); | ||
382 | } | ||
383 | } | ||
384 | |||
385 | // Don't append ACKs to resent packets, in case that's what was causing the | ||
386 | // delivery to fail | ||
387 | if (!Pack.Header.Resent) | ||
388 | { | ||
389 | // Append any ACKs that need to be sent out to this packet | ||
390 | lock (PendingAcks) | ||
391 | { | ||
392 | if (PendingAcks.Count > 0 && PendingAcks.Count < MAX_APPENDED_ACKS && | ||
393 | Pack.Type != PacketType.PacketAck && | ||
394 | Pack.Type != PacketType.LogoutRequest) | ||
395 | { | ||
396 | Pack.Header.AckList = new uint[PendingAcks.Count]; | ||
397 | int i = 0; | ||
398 | |||
399 | foreach (uint ack in PendingAcks.Values) | ||
400 | { | ||
401 | Pack.Header.AckList[i] = ack; | ||
402 | i++; | ||
403 | } | ||
404 | |||
405 | PendingAcks.Clear(); | ||
406 | Pack.Header.AppendedAcks = true; | ||
407 | } | ||
408 | } | ||
409 | } | ||
410 | } | ||
411 | } | ||
412 | |||
413 | byte[] ZeroOutBuffer = new byte[4096]; | ||
414 | byte[] sendbuffer; | ||
415 | sendbuffer = Pack.ToBytes(); | ||
416 | |||
417 | try | ||
418 | { | ||
419 | if (Pack.Header.Zerocoded) | ||
420 | { | ||
421 | int packetsize = Helpers.ZeroEncode(sendbuffer, sendbuffer.Length, ZeroOutBuffer); | ||
422 | m_networkServer.SendPacketTo(ZeroOutBuffer, packetsize, SocketFlags.None, CircuitCode);//userEP); | ||
423 | } | ||
424 | else | ||
425 | { | ||
426 | m_networkServer.SendPacketTo(sendbuffer, sendbuffer.Length, SocketFlags.None, CircuitCode); //userEP); | ||
427 | } | ||
428 | } | ||
429 | catch (Exception) | ||
430 | { | ||
431 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.MEDIUM, "OpenSimClient.cs:ProcessOutPacket() - WARNING: Socket exception occurred on connection " + userEP.ToString() + " - killing thread"); | ||
432 | ClientThread.Abort(); | ||
433 | } | ||
434 | |||
435 | } | ||
436 | |||
437 | public virtual void InPacket(Packet NewPack) | ||
438 | { | ||
439 | // Handle appended ACKs | ||
440 | if (NewPack.Header.AppendedAcks) | ||
441 | { | ||
442 | lock (NeedAck) | ||
443 | { | ||
444 | foreach (uint ack in NewPack.Header.AckList) | ||
445 | { | ||
446 | NeedAck.Remove(ack); | ||
447 | } | ||
448 | } | ||
449 | } | ||
450 | |||
451 | // Handle PacketAck packets | ||
452 | if (NewPack.Type == PacketType.PacketAck) | ||
453 | { | ||
454 | PacketAckPacket ackPacket = (PacketAckPacket)NewPack; | ||
455 | |||
456 | lock (NeedAck) | ||
457 | { | ||
458 | foreach (PacketAckPacket.PacketsBlock block in ackPacket.Packets) | ||
459 | { | ||
460 | NeedAck.Remove(block.ID); | ||
461 | } | ||
462 | } | ||
463 | } | ||
464 | else if ((NewPack.Type == PacketType.StartPingCheck)) | ||
465 | { | ||
466 | //reply to pingcheck | ||
467 | libsecondlife.Packets.StartPingCheckPacket startPing = (libsecondlife.Packets.StartPingCheckPacket)NewPack; | ||
468 | libsecondlife.Packets.CompletePingCheckPacket endPing = new CompletePingCheckPacket(); | ||
469 | endPing.PingID.PingID = startPing.PingID.PingID; | ||
470 | OutPacket(endPing); | ||
471 | } | ||
472 | else | ||
473 | { | ||
474 | QueItem item = new QueItem(); | ||
475 | item.Packet = NewPack; | ||
476 | item.Incoming = true; | ||
477 | this.PacketQueue.Enqueue(item); | ||
478 | } | ||
479 | |||
480 | } | ||
481 | |||
482 | public virtual void OutPacket(Packet NewPack) | ||
483 | { | ||
484 | QueItem item = new QueItem(); | ||
485 | item.Packet = NewPack; | ||
486 | item.Incoming = false; | ||
487 | this.PacketQueue.Enqueue(item); | ||
488 | } | ||
489 | |||
490 | protected virtual void ClientLoop() | 238 | protected virtual void ClientLoop() |
491 | { | 239 | { |
492 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.LOW, "OpenSimClient.cs:ClientLoop() - Entered loop"); | 240 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.LOW, "OpenSimClient.cs:ClientLoop() - Entered loop"); |
@@ -506,8 +254,6 @@ namespace OpenSim | |||
506 | } | 254 | } |
507 | } | 255 | } |
508 | 256 | ||
509 | #endregion | ||
510 | |||
511 | # region Setup | 257 | # region Setup |
512 | 258 | ||
513 | protected virtual void InitNewClient() | 259 | protected virtual void InitNewClient() |
@@ -556,6 +302,31 @@ namespace OpenSim | |||
556 | } | 302 | } |
557 | # endregion | 303 | # endregion |
558 | 304 | ||
305 | |||
306 | protected override void KillThread() | ||
307 | { | ||
308 | this.ClientThread.Abort(); | ||
309 | } | ||
310 | |||
311 | #region World/Avatar To Viewer Methods | ||
312 | |||
313 | public void SendChatMessage(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID) | ||
314 | { | ||
315 | System.Text.Encoding enc = System.Text.Encoding.ASCII; | ||
316 | libsecondlife.Packets.ChatFromSimulatorPacket reply = new ChatFromSimulatorPacket(); | ||
317 | reply.ChatData.Audible = 1; | ||
318 | reply.ChatData.Message = message; | ||
319 | reply.ChatData.ChatType = type; | ||
320 | reply.ChatData.SourceType = 1; | ||
321 | reply.ChatData.Position = fromPos; | ||
322 | reply.ChatData.FromName = enc.GetBytes(fromName + "\0"); | ||
323 | reply.ChatData.OwnerID = fromAgentID; | ||
324 | reply.ChatData.SourceID = fromAgentID; | ||
325 | |||
326 | this.OutPacket(reply); | ||
327 | } | ||
328 | #endregion | ||
329 | |||
559 | #region Inventory Creation | 330 | #region Inventory Creation |
560 | private void SetupInventory(AuthenticateResponse sessionInfo) | 331 | private void SetupInventory(AuthenticateResponse sessionInfo) |
561 | { | 332 | { |
@@ -646,17 +417,5 @@ namespace OpenSim | |||
646 | } | 417 | } |
647 | #endregion | 418 | #endregion |
648 | 419 | ||
649 | #region Nested Classes | ||
650 | |||
651 | public class QueItem | ||
652 | { | ||
653 | public QueItem() | ||
654 | { | ||
655 | } | ||
656 | |||
657 | public Packet Packet; | ||
658 | public bool Incoming; | ||
659 | } | ||
660 | #endregion | ||
661 | } | 420 | } |
662 | } | 421 | } |
diff --git a/OpenSim.RegionServer/ClientViewBase.cs b/OpenSim.RegionServer/ClientViewBase.cs new file mode 100644 index 0000000..814b025 --- /dev/null +++ b/OpenSim.RegionServer/ClientViewBase.cs | |||
@@ -0,0 +1,299 @@ | |||
1 | using System; | ||
2 | using System.Collections; | ||
3 | using System.Collections.Generic; | ||
4 | using libsecondlife; | ||
5 | using libsecondlife.Packets; | ||
6 | using System.Net; | ||
7 | using System.Net.Sockets; | ||
8 | using System.IO; | ||
9 | using System.Threading; | ||
10 | using System.Timers; | ||
11 | using OpenSim.Framework.Utilities; | ||
12 | |||
13 | |||
14 | namespace OpenSim | ||
15 | { | ||
16 | public class ClientViewBase | ||
17 | { | ||
18 | protected BlockingQueue<QueItem> PacketQueue; | ||
19 | protected Dictionary<uint, uint> PendingAcks = new Dictionary<uint, uint>(); | ||
20 | protected Dictionary<uint, Packet> NeedAck = new Dictionary<uint, Packet>(); | ||
21 | |||
22 | protected System.Timers.Timer AckTimer; | ||
23 | protected uint Sequence = 0; | ||
24 | protected object SequenceLock = new object(); | ||
25 | protected const int MAX_APPENDED_ACKS = 10; | ||
26 | protected const int RESEND_TIMEOUT = 4000; | ||
27 | protected const int MAX_SEQUENCE = 0xFFFFFF; | ||
28 | |||
29 | public uint CircuitCode; | ||
30 | public EndPoint userEP; | ||
31 | |||
32 | protected OpenSimNetworkHandler m_networkServer; | ||
33 | |||
34 | public ClientViewBase() | ||
35 | { | ||
36 | |||
37 | } | ||
38 | |||
39 | protected virtual void ProcessInPacket(Packet Pack) | ||
40 | { | ||
41 | |||
42 | } | ||
43 | |||
44 | protected virtual void ProcessOutPacket(Packet Pack) | ||
45 | { | ||
46 | // Keep track of when this packet was sent out | ||
47 | Pack.TickCount = Environment.TickCount; | ||
48 | |||
49 | if (!Pack.Header.Resent) | ||
50 | { | ||
51 | // Set the sequence number | ||
52 | lock (SequenceLock) | ||
53 | { | ||
54 | if (Sequence >= MAX_SEQUENCE) | ||
55 | Sequence = 1; | ||
56 | else | ||
57 | Sequence++; | ||
58 | Pack.Header.Sequence = Sequence; | ||
59 | } | ||
60 | |||
61 | if (Pack.Header.Reliable) //DIRTY HACK | ||
62 | { | ||
63 | lock (NeedAck) | ||
64 | { | ||
65 | if (!NeedAck.ContainsKey(Pack.Header.Sequence)) | ||
66 | { | ||
67 | try | ||
68 | { | ||
69 | NeedAck.Add(Pack.Header.Sequence, Pack); | ||
70 | } | ||
71 | catch (Exception e) // HACKY | ||
72 | { | ||
73 | e.ToString(); | ||
74 | // Ignore | ||
75 | // Seems to throw a exception here occasionally | ||
76 | // of 'duplicate key' despite being locked. | ||
77 | // !?!?!? | ||
78 | } | ||
79 | } | ||
80 | else | ||
81 | { | ||
82 | // Client.Log("Attempted to add a duplicate sequence number (" + | ||
83 | // packet.Header.Sequence + ") to the NeedAck dictionary for packet type " + | ||
84 | // packet.Type.ToString(), Helpers.LogLevel.Warning); | ||
85 | } | ||
86 | } | ||
87 | |||
88 | // Don't append ACKs to resent packets, in case that's what was causing the | ||
89 | // delivery to fail | ||
90 | if (!Pack.Header.Resent) | ||
91 | { | ||
92 | // Append any ACKs that need to be sent out to this packet | ||
93 | lock (PendingAcks) | ||
94 | { | ||
95 | if (PendingAcks.Count > 0 && PendingAcks.Count < MAX_APPENDED_ACKS && | ||
96 | Pack.Type != PacketType.PacketAck && | ||
97 | Pack.Type != PacketType.LogoutRequest) | ||
98 | { | ||
99 | Pack.Header.AckList = new uint[PendingAcks.Count]; | ||
100 | int i = 0; | ||
101 | |||
102 | foreach (uint ack in PendingAcks.Values) | ||
103 | { | ||
104 | Pack.Header.AckList[i] = ack; | ||
105 | i++; | ||
106 | } | ||
107 | |||
108 | PendingAcks.Clear(); | ||
109 | Pack.Header.AppendedAcks = true; | ||
110 | } | ||
111 | } | ||
112 | } | ||
113 | } | ||
114 | } | ||
115 | |||
116 | byte[] ZeroOutBuffer = new byte[4096]; | ||
117 | byte[] sendbuffer; | ||
118 | sendbuffer = Pack.ToBytes(); | ||
119 | |||
120 | try | ||
121 | { | ||
122 | if (Pack.Header.Zerocoded) | ||
123 | { | ||
124 | int packetsize = Helpers.ZeroEncode(sendbuffer, sendbuffer.Length, ZeroOutBuffer); | ||
125 | m_networkServer.SendPacketTo(ZeroOutBuffer, packetsize, SocketFlags.None, CircuitCode);//userEP); | ||
126 | } | ||
127 | else | ||
128 | { | ||
129 | m_networkServer.SendPacketTo(sendbuffer, sendbuffer.Length, SocketFlags.None, CircuitCode); //userEP); | ||
130 | } | ||
131 | } | ||
132 | catch (Exception) | ||
133 | { | ||
134 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.MEDIUM, "OpenSimClient.cs:ProcessOutPacket() - WARNING: Socket exception occurred on connection " + userEP.ToString() + " - killing thread"); | ||
135 | this.KillThread(); | ||
136 | } | ||
137 | |||
138 | } | ||
139 | |||
140 | public virtual void InPacket(Packet NewPack) | ||
141 | { | ||
142 | // Handle appended ACKs | ||
143 | if (NewPack.Header.AppendedAcks) | ||
144 | { | ||
145 | lock (NeedAck) | ||
146 | { | ||
147 | foreach (uint ack in NewPack.Header.AckList) | ||
148 | { | ||
149 | NeedAck.Remove(ack); | ||
150 | } | ||
151 | } | ||
152 | } | ||
153 | |||
154 | // Handle PacketAck packets | ||
155 | if (NewPack.Type == PacketType.PacketAck) | ||
156 | { | ||
157 | PacketAckPacket ackPacket = (PacketAckPacket)NewPack; | ||
158 | |||
159 | lock (NeedAck) | ||
160 | { | ||
161 | foreach (PacketAckPacket.PacketsBlock block in ackPacket.Packets) | ||
162 | { | ||
163 | NeedAck.Remove(block.ID); | ||
164 | } | ||
165 | } | ||
166 | } | ||
167 | else if ((NewPack.Type == PacketType.StartPingCheck)) | ||
168 | { | ||
169 | //reply to pingcheck | ||
170 | libsecondlife.Packets.StartPingCheckPacket startPing = (libsecondlife.Packets.StartPingCheckPacket)NewPack; | ||
171 | libsecondlife.Packets.CompletePingCheckPacket endPing = new CompletePingCheckPacket(); | ||
172 | endPing.PingID.PingID = startPing.PingID.PingID; | ||
173 | OutPacket(endPing); | ||
174 | } | ||
175 | else | ||
176 | { | ||
177 | QueItem item = new QueItem(); | ||
178 | item.Packet = NewPack; | ||
179 | item.Incoming = true; | ||
180 | this.PacketQueue.Enqueue(item); | ||
181 | } | ||
182 | |||
183 | } | ||
184 | |||
185 | public virtual void OutPacket(Packet NewPack) | ||
186 | { | ||
187 | QueItem item = new QueItem(); | ||
188 | item.Packet = NewPack; | ||
189 | item.Incoming = false; | ||
190 | this.PacketQueue.Enqueue(item); | ||
191 | } | ||
192 | |||
193 | # region Low Level Packet Methods | ||
194 | |||
195 | protected void ack_pack(Packet Pack) | ||
196 | { | ||
197 | if (Pack.Header.Reliable) | ||
198 | { | ||
199 | libsecondlife.Packets.PacketAckPacket ack_it = new PacketAckPacket(); | ||
200 | ack_it.Packets = new PacketAckPacket.PacketsBlock[1]; | ||
201 | ack_it.Packets[0] = new PacketAckPacket.PacketsBlock(); | ||
202 | ack_it.Packets[0].ID = Pack.Header.Sequence; | ||
203 | ack_it.Header.Reliable = false; | ||
204 | |||
205 | OutPacket(ack_it); | ||
206 | |||
207 | } | ||
208 | /* | ||
209 | if (Pack.Header.Reliable) | ||
210 | { | ||
211 | lock (PendingAcks) | ||
212 | { | ||
213 | uint sequence = (uint)Pack.Header.Sequence; | ||
214 | if (!PendingAcks.ContainsKey(sequence)) { PendingAcks[sequence] = sequence; } | ||
215 | } | ||
216 | }*/ | ||
217 | } | ||
218 | |||
219 | protected void ResendUnacked() | ||
220 | { | ||
221 | int now = Environment.TickCount; | ||
222 | |||
223 | lock (NeedAck) | ||
224 | { | ||
225 | foreach (Packet packet in NeedAck.Values) | ||
226 | { | ||
227 | if ((now - packet.TickCount > RESEND_TIMEOUT) && (!packet.Header.Resent)) | ||
228 | { | ||
229 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.VERBOSE, "Resending " + packet.Type.ToString() + " packet, " + | ||
230 | (now - packet.TickCount) + "ms have passed"); | ||
231 | |||
232 | packet.Header.Resent = true; | ||
233 | OutPacket(packet); | ||
234 | } | ||
235 | } | ||
236 | } | ||
237 | } | ||
238 | |||
239 | protected void SendAcks() | ||
240 | { | ||
241 | lock (PendingAcks) | ||
242 | { | ||
243 | if (PendingAcks.Count > 0) | ||
244 | { | ||
245 | if (PendingAcks.Count > 250) | ||
246 | { | ||
247 | // FIXME: Handle the odd case where we have too many pending ACKs queued up | ||
248 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.VERBOSE, "Too many ACKs queued up!"); | ||
249 | return; | ||
250 | } | ||
251 | |||
252 | //OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Sending PacketAck"); | ||
253 | |||
254 | |||
255 | int i = 0; | ||
256 | PacketAckPacket acks = new PacketAckPacket(); | ||
257 | acks.Packets = new PacketAckPacket.PacketsBlock[PendingAcks.Count]; | ||
258 | |||
259 | foreach (uint ack in PendingAcks.Values) | ||
260 | { | ||
261 | acks.Packets[i] = new PacketAckPacket.PacketsBlock(); | ||
262 | acks.Packets[i].ID = ack; | ||
263 | i++; | ||
264 | } | ||
265 | |||
266 | acks.Header.Reliable = false; | ||
267 | OutPacket(acks); | ||
268 | |||
269 | PendingAcks.Clear(); | ||
270 | } | ||
271 | } | ||
272 | } | ||
273 | |||
274 | protected void AckTimer_Elapsed(object sender, ElapsedEventArgs ea) | ||
275 | { | ||
276 | SendAcks(); | ||
277 | ResendUnacked(); | ||
278 | } | ||
279 | #endregion | ||
280 | |||
281 | protected virtual void KillThread() | ||
282 | { | ||
283 | |||
284 | } | ||
285 | |||
286 | #region Nested Classes | ||
287 | |||
288 | public class QueItem | ||
289 | { | ||
290 | public QueItem() | ||
291 | { | ||
292 | } | ||
293 | |||
294 | public Packet Packet; | ||
295 | public bool Incoming; | ||
296 | } | ||
297 | #endregion | ||
298 | } | ||
299 | } | ||
diff --git a/OpenSim.RegionServer/OpenSim.RegionServer.csproj b/OpenSim.RegionServer/OpenSim.RegionServer.csproj index 93285b4..512ee88 100644 --- a/OpenSim.RegionServer/OpenSim.RegionServer.csproj +++ b/OpenSim.RegionServer/OpenSim.RegionServer.csproj | |||
@@ -136,40 +136,40 @@ | |||
136 | <Compile Include="AuthenticateSessionsRemote.cs"> | 136 | <Compile Include="AuthenticateSessionsRemote.cs"> |
137 | <SubType>Code</SubType> | 137 | <SubType>Code</SubType> |
138 | </Compile> | 138 | </Compile> |
139 | <Compile Include="Grid.cs"> | 139 | <Compile Include="ClientView.cs"> |
140 | <SubType>Code</SubType> | 140 | <SubType>Code</SubType> |
141 | </Compile> | 141 | </Compile> |
142 | <Compile Include="OpenSimMain.cs"> | 142 | <Compile Include="ClientView.Grid.cs"> |
143 | <SubType>Code</SubType> | 143 | <SubType>Code</SubType> |
144 | </Compile> | 144 | </Compile> |
145 | <Compile Include="OpenSimNetworkHandler.cs"> | 145 | <Compile Include="ClientView.PacketHandlers.cs"> |
146 | <SubType>Code</SubType> | 146 | <SubType>Code</SubType> |
147 | </Compile> | 147 | </Compile> |
148 | <Compile Include="PacketServer.cs"> | 148 | <Compile Include="ClientView.ProcessPackets.cs"> |
149 | <SubType>Code</SubType> | 149 | <SubType>Code</SubType> |
150 | </Compile> | 150 | </Compile> |
151 | <Compile Include="RegionInfo.cs"> | 151 | <Compile Include="ClientViewBase.cs"> |
152 | <SubType>Code</SubType> | 152 | <SubType>Code</SubType> |
153 | </Compile> | 153 | </Compile> |
154 | <Compile Include="RegionInfoBase.cs"> | 154 | <Compile Include="Grid.cs"> |
155 | <SubType>Code</SubType> | 155 | <SubType>Code</SubType> |
156 | </Compile> | 156 | </Compile> |
157 | <Compile Include="RegionServerBase.cs"> | 157 | <Compile Include="OpenSimMain.cs"> |
158 | <SubType>Code</SubType> | 158 | <SubType>Code</SubType> |
159 | </Compile> | 159 | </Compile> |
160 | <Compile Include="SimClient.cs"> | 160 | <Compile Include="OpenSimNetworkHandler.cs"> |
161 | <SubType>Code</SubType> | 161 | <SubType>Code</SubType> |
162 | </Compile> | 162 | </Compile> |
163 | <Compile Include="SimClient.Grid.cs"> | 163 | <Compile Include="PacketServer.cs"> |
164 | <SubType>Code</SubType> | 164 | <SubType>Code</SubType> |
165 | </Compile> | 165 | </Compile> |
166 | <Compile Include="SimClient.PacketHandlers.cs"> | 166 | <Compile Include="RegionInfo.cs"> |
167 | <SubType>Code</SubType> | 167 | <SubType>Code</SubType> |
168 | </Compile> | 168 | </Compile> |
169 | <Compile Include="SimClient.ProcessPackets.cs"> | 169 | <Compile Include="RegionInfoBase.cs"> |
170 | <SubType>Code</SubType> | 170 | <SubType>Code</SubType> |
171 | </Compile> | 171 | </Compile> |
172 | <Compile Include="SimClientBase.cs"> | 172 | <Compile Include="RegionServerBase.cs"> |
173 | <SubType>Code</SubType> | 173 | <SubType>Code</SubType> |
174 | </Compile> | 174 | </Compile> |
175 | <Compile Include="UDPServer.cs"> | 175 | <Compile Include="UDPServer.cs"> |
diff --git a/OpenSim.RegionServer/OpenSim.RegionServer.dll.build b/OpenSim.RegionServer/OpenSim.RegionServer.dll.build index 35985ac..4ec3537 100644 --- a/OpenSim.RegionServer/OpenSim.RegionServer.dll.build +++ b/OpenSim.RegionServer/OpenSim.RegionServer.dll.build | |||
@@ -15,6 +15,11 @@ | |||
15 | <include name="AuthenticateSessionsBase.cs" /> | 15 | <include name="AuthenticateSessionsBase.cs" /> |
16 | <include name="AuthenticateSessionsLocal.cs" /> | 16 | <include name="AuthenticateSessionsLocal.cs" /> |
17 | <include name="AuthenticateSessionsRemote.cs" /> | 17 | <include name="AuthenticateSessionsRemote.cs" /> |
18 | <include name="ClientView.cs" /> | ||
19 | <include name="ClientView.Grid.cs" /> | ||
20 | <include name="ClientView.PacketHandlers.cs" /> | ||
21 | <include name="ClientView.ProcessPackets.cs" /> | ||
22 | <include name="ClientViewBase.cs" /> | ||
18 | <include name="Grid.cs" /> | 23 | <include name="Grid.cs" /> |
19 | <include name="OpenSimMain.cs" /> | 24 | <include name="OpenSimMain.cs" /> |
20 | <include name="OpenSimNetworkHandler.cs" /> | 25 | <include name="OpenSimNetworkHandler.cs" /> |
@@ -22,11 +27,6 @@ | |||
22 | <include name="RegionInfo.cs" /> | 27 | <include name="RegionInfo.cs" /> |
23 | <include name="RegionInfoBase.cs" /> | 28 | <include name="RegionInfoBase.cs" /> |
24 | <include name="RegionServerBase.cs" /> | 29 | <include name="RegionServerBase.cs" /> |
25 | <include name="SimClient.cs" /> | ||
26 | <include name="SimClient.Grid.cs" /> | ||
27 | <include name="SimClient.PacketHandlers.cs" /> | ||
28 | <include name="SimClient.ProcessPackets.cs" /> | ||
29 | <include name="SimClientBase.cs" /> | ||
30 | <include name="UDPServer.cs" /> | 30 | <include name="UDPServer.cs" /> |
31 | <include name="VersionInfo.cs" /> | 31 | <include name="VersionInfo.cs" /> |
32 | <include name="Assets/AssetCache.cs" /> | 32 | <include name="Assets/AssetCache.cs" /> |
diff --git a/OpenSim.RegionServer/PacketServer.cs b/OpenSim.RegionServer/PacketServer.cs index b60d10f..cb7de11 100644 --- a/OpenSim.RegionServer/PacketServer.cs +++ b/OpenSim.RegionServer/PacketServer.cs | |||
@@ -10,7 +10,7 @@ namespace OpenSim | |||
10 | { | 10 | { |
11 | private OpenSimNetworkHandler _networkHandler; | 11 | private OpenSimNetworkHandler _networkHandler; |
12 | private World _localWorld; | 12 | private World _localWorld; |
13 | public Dictionary<uint, SimClient> ClientThreads = new Dictionary<uint, SimClient>(); | 13 | public Dictionary<uint, ClientView> ClientThreads = new Dictionary<uint, ClientView>(); |
14 | 14 | ||
15 | public PacketServer(OpenSimNetworkHandler networkHandler) | 15 | public PacketServer(OpenSimNetworkHandler networkHandler) |
16 | { | 16 | { |
@@ -44,7 +44,7 @@ namespace OpenSim | |||
44 | 44 | ||
45 | } | 45 | } |
46 | 46 | ||
47 | public virtual void SendPacketToAllExcept(Packet packet, SimClient simClient) | 47 | public virtual void SendPacketToAllExcept(Packet packet, ClientView simClient) |
48 | { | 48 | { |
49 | 49 | ||
50 | } | 50 | } |
@@ -58,17 +58,16 @@ namespace OpenSim | |||
58 | { | 58 | { |
59 | if (this._localWorld != null) | 59 | if (this._localWorld != null) |
60 | { | 60 | { |
61 | SimClient.AddPacketHandler(PacketType.ModifyLand, _localWorld.ModifyTerrain); | 61 | ClientView.AddPacketHandler(PacketType.ModifyLand, _localWorld.ModifyTerrain); |
62 | SimClient.AddPacketHandler(PacketType.ChatFromViewer, _localWorld.SimChat); | 62 | ClientView.AddPacketHandler(PacketType.RezObject, _localWorld.RezObject); |
63 | SimClient.AddPacketHandler(PacketType.RezObject, _localWorld.RezObject); | 63 | ClientView.AddPacketHandler(PacketType.DeRezObject, _localWorld.DeRezObject); |
64 | SimClient.AddPacketHandler(PacketType.DeRezObject, _localWorld.DeRezObject); | 64 | ClientView.AddPacketHandler(PacketType.UUIDNameRequest, this.RequestUUIDName); |
65 | SimClient.AddPacketHandler(PacketType.UUIDNameRequest, this.RequestUUIDName); | ||
66 | } | 65 | } |
67 | } | 66 | } |
68 | 67 | ||
69 | #region Client Packet Handlers | 68 | #region Client Packet Handlers |
70 | 69 | ||
71 | public bool RequestUUIDName(SimClient simClient, Packet packet) | 70 | public bool RequestUUIDName(ClientView simClient, Packet packet) |
72 | { | 71 | { |
73 | System.Text.Encoding enc = System.Text.Encoding.ASCII; | 72 | System.Text.Encoding enc = System.Text.Encoding.ASCII; |
74 | Console.WriteLine(packet.ToString()); | 73 | Console.WriteLine(packet.ToString()); |
diff --git a/OpenSim.RegionServer/SimClientBase.cs b/OpenSim.RegionServer/SimClientBase.cs deleted file mode 100644 index d0dd381..0000000 --- a/OpenSim.RegionServer/SimClientBase.cs +++ /dev/null | |||
@@ -1,32 +0,0 @@ | |||
1 | using System; | ||
2 | using System.Collections.Generic; | ||
3 | using System.Text; | ||
4 | using libsecondlife; | ||
5 | using libsecondlife.Packets; | ||
6 | |||
7 | namespace OpenSim | ||
8 | { | ||
9 | public class SimClientBase | ||
10 | { | ||
11 | |||
12 | protected virtual void ProcessInPacket(Packet Pack) | ||
13 | { | ||
14 | |||
15 | } | ||
16 | |||
17 | protected virtual void ProcessOutPacket(Packet Pack) | ||
18 | { | ||
19 | |||
20 | } | ||
21 | |||
22 | public virtual void InPacket(Packet NewPack) | ||
23 | { | ||
24 | |||
25 | } | ||
26 | |||
27 | public virtual void OutPacket(Packet NewPack) | ||
28 | { | ||
29 | |||
30 | } | ||
31 | } | ||
32 | } | ||
diff --git a/OpenSim.RegionServer/UDPServer.cs b/OpenSim.RegionServer/UDPServer.cs index 0bab05a..3a93e66 100644 --- a/OpenSim.RegionServer/UDPServer.cs +++ b/OpenSim.RegionServer/UDPServer.cs | |||
@@ -133,7 +133,7 @@ namespace OpenSim | |||
133 | this.clientCircuits.Add(epSender, useCircuit.CircuitCode.Code); | 133 | this.clientCircuits.Add(epSender, useCircuit.CircuitCode.Code); |
134 | bool isChildAgent = false; | 134 | bool isChildAgent = false; |
135 | 135 | ||
136 | SimClient newuser = new SimClient(epSender, useCircuit, m_localWorld, _packetServer.ClientThreads, m_assetCache, m_gridServers.GridServer, this, m_inventoryCache, m_sandbox, isChildAgent, this.m_regionData, m_authenticateSessionsClass); | 136 | ClientView newuser = new ClientView(epSender, useCircuit, m_localWorld, _packetServer.ClientThreads, m_assetCache, m_gridServers.GridServer, this, m_inventoryCache, m_sandbox, isChildAgent, this.m_regionData, m_authenticateSessionsClass); |
137 | if ((this.m_gridServers.UserServer != null) && (user_accounts)) | 137 | if ((this.m_gridServers.UserServer != null) && (user_accounts)) |
138 | { | 138 | { |
139 | newuser.UserServer = this.m_gridServers.UserServer; | 139 | newuser.UserServer = this.m_gridServers.UserServer; |
diff --git a/OpenSim.RegionServer/world/Avatar.Update.cs b/OpenSim.RegionServer/world/Avatar.Update.cs index ba2965d..75f0bb4 100644 --- a/OpenSim.RegionServer/world/Avatar.Update.cs +++ b/OpenSim.RegionServer/world/Avatar.Update.cs | |||
@@ -28,9 +28,10 @@ namespace OpenSim.world | |||
28 | terse.RegionData.TimeDilation = 64096; | 28 | terse.RegionData.TimeDilation = 64096; |
29 | terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; | 29 | terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; |
30 | terse.ObjectData[0] = terseBlock; | 30 | terse.ObjectData[0] = terseBlock; |
31 | foreach (SimClient client in m_clientThreads.Values) | 31 | List<Avatar> avList = this.m_world.RequestAvatarList(); |
32 | foreach (Avatar client in avList) | ||
32 | { | 33 | { |
33 | client.OutPacket(terse); | 34 | client.SendPacketToViewer(terse); |
34 | } | 35 | } |
35 | 36 | ||
36 | updateflag = false; | 37 | updateflag = false; |
@@ -51,9 +52,10 @@ namespace OpenSim.world | |||
51 | terse.RegionData.TimeDilation = 64096; | 52 | terse.RegionData.TimeDilation = 64096; |
52 | terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; | 53 | terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; |
53 | terse.ObjectData[0] = terseBlock; | 54 | terse.ObjectData[0] = terseBlock; |
54 | foreach (SimClient client in m_clientThreads.Values) | 55 | List<Avatar> avList = this.m_world.RequestAvatarList(); |
56 | foreach (Avatar client in avList) | ||
55 | { | 57 | { |
56 | client.OutPacket(terse); | 58 | client.SendPacketToViewer(terse); |
57 | } | 59 | } |
58 | _updateCount = 0; | 60 | _updateCount = 0; |
59 | } | 61 | } |
@@ -134,15 +136,13 @@ namespace OpenSim.world | |||
134 | byte[] pb = pos2.GetBytes(); | 136 | byte[] pb = pos2.GetBytes(); |
135 | Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 16, pb.Length); | 137 | Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 16, pb.Length); |
136 | m_world._localNumber++; | 138 | m_world._localNumber++; |
137 | foreach (SimClient client in m_clientThreads.Values) | 139 | |
140 | List<Avatar> avList = this.m_world.RequestAvatarList(); | ||
141 | foreach (Avatar client in avList) | ||
138 | { | 142 | { |
139 | client.OutPacket(objupdate); | 143 | client.SendPacketToViewer(objupdate); |
140 | if (client.AgentID != ControllingClient.AgentID) | 144 | if (client.ControllingClient.AgentID != this.ControllingClient.AgentID) |
141 | { | 145 | { |
142 | //the below line is already in Simclient.cs at line number 245 , directly below the call to this method | ||
143 | //if there is a problem/bug with that , then lets fix it there rather than duplicating it here | ||
144 | //client.ClientAvatar.SendAppearanceToOtherAgent(this.ControllingClient); | ||
145 | |||
146 | SendAppearanceToOtherAgent(client); | 146 | SendAppearanceToOtherAgent(client); |
147 | } | 147 | } |
148 | } | 148 | } |
@@ -169,30 +169,12 @@ namespace OpenSim.world | |||
169 | ControllingClient.OutPacket(aw); | 169 | ControllingClient.OutPacket(aw); |
170 | } | 170 | } |
171 | 171 | ||
172 | public void SendAppearanceToOtherAgent(SimClient userInfo) | 172 | public void SendAppearanceToOtherAgent(Avatar avatarInfo) |
173 | { | 173 | { |
174 | AvatarAppearancePacket avp = new AvatarAppearancePacket(); | 174 | AvatarAppearancePacket avp = new AvatarAppearancePacket(); |
175 | avp.VisualParam = new AvatarAppearancePacket.VisualParamBlock[218]; | 175 | avp.VisualParam = new AvatarAppearancePacket.VisualParamBlock[218]; |
176 | avp.ObjectData.TextureEntry = this.avatarAppearanceTexture.ToBytes(); | 176 | avp.ObjectData.TextureEntry = this.avatarAppearanceTexture.ToBytes(); |
177 | 177 | ||
178 | //a wearable update packets should only be sent about the viewers/agents own avatar not for other avatars | ||
179 | //but it seems that the following code only created the packets and never actually sent them anyway | ||
180 | /*AgentWearablesUpdatePacket aw = new AgentWearablesUpdatePacket(); | ||
181 | aw.AgentData.AgentID = this.ControllingClient.AgentID; | ||
182 | aw.AgentData.SessionID = userInfo.SessionID; | ||
183 | aw.AgentData.SerialNum = 0; //removed the use of a random number as a random number could be less than the last number, should have a counter variable for this | ||
184 | |||
185 | aw.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[13]; | ||
186 | AgentWearablesUpdatePacket.WearableDataBlock awb; | ||
187 | for (int i = 0; i < 13; i++) | ||
188 | { | ||
189 | awb = new AgentWearablesUpdatePacket.WearableDataBlock(); | ||
190 | awb.WearableType = (byte)i; | ||
191 | awb.AssetID = this.Wearables[i].AssetID; | ||
192 | awb.ItemID = this.Wearables[i].ItemID; | ||
193 | aw.WearableData[i] = awb; | ||
194 | }*/ | ||
195 | |||
196 | AvatarAppearancePacket.VisualParamBlock avblock = null; | 178 | AvatarAppearancePacket.VisualParamBlock avblock = null; |
197 | for (int i = 0; i < 218; i++) | 179 | for (int i = 0; i < 218; i++) |
198 | { | 180 | { |
@@ -203,7 +185,7 @@ namespace OpenSim.world | |||
203 | 185 | ||
204 | avp.Sender.IsTrial = false; | 186 | avp.Sender.IsTrial = false; |
205 | avp.Sender.ID = ControllingClient.AgentID; | 187 | avp.Sender.ID = ControllingClient.AgentID; |
206 | userInfo.OutPacket(avp); | 188 | avatarInfo.SendPacketToViewer(avp); |
207 | } | 189 | } |
208 | 190 | ||
209 | public void SetAppearance(AgentSetAppearancePacket appear) | 191 | public void SetAppearance(AgentSetAppearancePacket appear) |
@@ -214,9 +196,11 @@ namespace OpenSim.world | |||
214 | { | 196 | { |
215 | this.visualParams[i] = appear.VisualParam[i].ParamValue; | 197 | this.visualParams[i] = appear.VisualParam[i].ParamValue; |
216 | } | 198 | } |
217 | foreach (SimClient client in m_clientThreads.Values) | 199 | |
200 | List<Avatar> avList = this.m_world.RequestAvatarList(); | ||
201 | foreach (Avatar client in avList) | ||
218 | { | 202 | { |
219 | if (client.AgentID != ControllingClient.AgentID) | 203 | if (client.ControllingClient.AgentID != this.ControllingClient.AgentID) |
220 | { | 204 | { |
221 | SendAppearanceToOtherAgent(client); | 205 | SendAppearanceToOtherAgent(client); |
222 | } | 206 | } |
@@ -320,11 +304,12 @@ namespace OpenSim.world | |||
320 | ani.AnimationList[0].AnimID = this.current_anim; | 304 | ani.AnimationList[0].AnimID = this.current_anim; |
321 | ani.AnimationList[0].AnimSequenceID = this.anim_seq; | 305 | ani.AnimationList[0].AnimSequenceID = this.anim_seq; |
322 | 306 | ||
323 | //ControllingClient.OutPacket(ani); | 307 | List<Avatar> avList = this.m_world.RequestAvatarList(); |
324 | foreach (SimClient client in m_clientThreads.Values) | 308 | foreach (Avatar client in avList) |
325 | { | 309 | { |
326 | client.OutPacket(ani); | 310 | client.SendPacketToViewer(ani); |
327 | } | 311 | } |
312 | |||
328 | } | 313 | } |
329 | 314 | ||
330 | } | 315 | } |
diff --git a/OpenSim.RegionServer/world/Avatar.cs b/OpenSim.RegionServer/world/Avatar.cs index c684c45..55e5ae4 100644 --- a/OpenSim.RegionServer/world/Avatar.cs +++ b/OpenSim.RegionServer/world/Avatar.cs | |||
@@ -16,7 +16,7 @@ namespace OpenSim.world | |||
16 | public static AvatarAnimations Animations; | 16 | public static AvatarAnimations Animations; |
17 | public string firstname; | 17 | public string firstname; |
18 | public string lastname; | 18 | public string lastname; |
19 | public SimClient ControllingClient; | 19 | public ClientView ControllingClient; |
20 | public LLUUID current_anim; | 20 | public LLUUID current_anim; |
21 | public int anim_seq; | 21 | public int anim_seq; |
22 | private static libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock AvatarTemplate; | 22 | private static libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock AvatarTemplate; |
@@ -30,16 +30,16 @@ namespace OpenSim.world | |||
30 | private AvatarWearable[] Wearables; | 30 | private AvatarWearable[] Wearables; |
31 | private LLVector3 positionLastFrame = new LLVector3(0, 0, 0); | 31 | private LLVector3 positionLastFrame = new LLVector3(0, 0, 0); |
32 | private ulong m_regionHandle; | 32 | private ulong m_regionHandle; |
33 | private Dictionary<uint, SimClient> m_clientThreads; | 33 | //private Dictionary<uint, ClientView> m_clientThreads; |
34 | private string m_regionName; | 34 | private string m_regionName; |
35 | private ushort m_regionWaterHeight; | 35 | private ushort m_regionWaterHeight; |
36 | private bool m_regionTerraform; | 36 | private bool m_regionTerraform; |
37 | //private bool childShadowAvatar = false; | 37 | //private bool childShadowAvatar = false; |
38 | 38 | ||
39 | public Avatar(SimClient TheClient, World world, string regionName, Dictionary<uint, SimClient> clientThreads, ulong regionHandle, bool regionTerraform, ushort regionWater) | 39 | public Avatar(ClientView TheClient, World world, string regionName, Dictionary<uint, ClientView> clientThreads, ulong regionHandle, bool regionTerraform, ushort regionWater) |
40 | { | 40 | { |
41 | m_world = world; | 41 | m_world = world; |
42 | m_clientThreads = clientThreads; | 42 | // m_clientThreads = clientThreads; |
43 | m_regionName = regionName; | 43 | m_regionName = regionName; |
44 | m_regionHandle = regionHandle; | 44 | m_regionHandle = regionHandle; |
45 | m_regionTerraform = regionTerraform; | 45 | m_regionTerraform = regionTerraform; |
diff --git a/OpenSim.RegionServer/world/Primitive.cs b/OpenSim.RegionServer/world/Primitive.cs index 4f861f7..e048a9e 100644 --- a/OpenSim.RegionServer/world/Primitive.cs +++ b/OpenSim.RegionServer/world/Primitive.cs | |||
@@ -22,7 +22,7 @@ namespace OpenSim.world | |||
22 | private bool physicsEnabled = false; | 22 | private bool physicsEnabled = false; |
23 | private bool physicstest = false; | 23 | private bool physicstest = false; |
24 | private LLVector3 positionLastFrame = new LLVector3(0, 0, 0); | 24 | private LLVector3 positionLastFrame = new LLVector3(0, 0, 0); |
25 | private Dictionary<uint, SimClient> m_clientThreads; | 25 | private Dictionary<uint, ClientView> m_clientThreads; |
26 | private ulong m_regionHandle; | 26 | private ulong m_regionHandle; |
27 | private const uint FULL_MASK_PERMISSIONS = 2147483647; | 27 | private const uint FULL_MASK_PERMISSIONS = 2147483647; |
28 | 28 | ||
@@ -75,7 +75,7 @@ namespace OpenSim.world | |||
75 | } | 75 | } |
76 | } | 76 | } |
77 | 77 | ||
78 | public Primitive(Dictionary<uint, SimClient> clientThreads, ulong regionHandle, World world) | 78 | public Primitive(Dictionary<uint, ClientView> clientThreads, ulong regionHandle, World world) |
79 | { | 79 | { |
80 | mesh_cutbegin = 0.0f; | 80 | mesh_cutbegin = 0.0f; |
81 | mesh_cutend = 1.0f; | 81 | mesh_cutend = 1.0f; |
@@ -104,7 +104,7 @@ namespace OpenSim.world | |||
104 | return this.primData.ToBytes(); | 104 | return this.primData.ToBytes(); |
105 | } | 105 | } |
106 | 106 | ||
107 | public void GetProperites(SimClient client) | 107 | public void GetProperites(ClientView client) |
108 | { | 108 | { |
109 | ObjectPropertiesPacket proper = new ObjectPropertiesPacket(); | 109 | ObjectPropertiesPacket proper = new ObjectPropertiesPacket(); |
110 | proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[1]; | 110 | proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[1]; |
@@ -164,7 +164,7 @@ namespace OpenSim.world | |||
164 | } | 164 | } |
165 | if (this.newPrimFlag) | 165 | if (this.newPrimFlag) |
166 | { | 166 | { |
167 | foreach (SimClient client in m_clientThreads.Values) | 167 | foreach (ClientView client in m_clientThreads.Values) |
168 | { | 168 | { |
169 | client.OutPacket(OurPacket); | 169 | client.OutPacket(OurPacket); |
170 | } | 170 | } |
@@ -177,7 +177,7 @@ namespace OpenSim.world | |||
177 | terse.RegionData.TimeDilation = 64096; | 177 | terse.RegionData.TimeDilation = 64096; |
178 | terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; | 178 | terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; |
179 | terse.ObjectData[0] = this.CreateImprovedBlock(); | 179 | terse.ObjectData[0] = this.CreateImprovedBlock(); |
180 | foreach (SimClient client in m_clientThreads.Values) | 180 | foreach (ClientView client in m_clientThreads.Values) |
181 | { | 181 | { |
182 | client.OutPacket(terse); | 182 | client.OutPacket(terse); |
183 | } | 183 | } |
@@ -185,7 +185,7 @@ namespace OpenSim.world | |||
185 | } | 185 | } |
186 | else if (this.dirtyFlag) | 186 | else if (this.dirtyFlag) |
187 | { | 187 | { |
188 | foreach (SimClient client in m_clientThreads.Values) | 188 | foreach (ClientView client in m_clientThreads.Values) |
189 | { | 189 | { |
190 | UpdateClient(client); | 190 | UpdateClient(client); |
191 | } | 191 | } |
@@ -202,7 +202,7 @@ namespace OpenSim.world | |||
202 | terse.RegionData.TimeDilation = 64096; | 202 | terse.RegionData.TimeDilation = 64096; |
203 | terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; | 203 | terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; |
204 | terse.ObjectData[0] = this.CreateImprovedBlock(); | 204 | terse.ObjectData[0] = this.CreateImprovedBlock(); |
205 | foreach (SimClient client in m_clientThreads.Values) | 205 | foreach (ClientView client in m_clientThreads.Values) |
206 | { | 206 | { |
207 | client.OutPacket(terse); | 207 | client.OutPacket(terse); |
208 | } | 208 | } |
@@ -220,7 +220,7 @@ namespace OpenSim.world | |||
220 | } | 220 | } |
221 | } | 221 | } |
222 | 222 | ||
223 | public void UpdateClient(SimClient RemoteClient) | 223 | public void UpdateClient(ClientView RemoteClient) |
224 | { | 224 | { |
225 | 225 | ||
226 | LLVector3 lPos; | 226 | LLVector3 lPos; |
diff --git a/OpenSim.RegionServer/world/Primitive2.cs b/OpenSim.RegionServer/world/Primitive2.cs index 3b39456..6d071d4 100644 --- a/OpenSim.RegionServer/world/Primitive2.cs +++ b/OpenSim.RegionServer/world/Primitive2.cs | |||
@@ -16,7 +16,7 @@ namespace OpenSim.world | |||
16 | protected PrimData primData; | 16 | protected PrimData primData; |
17 | //private ObjectUpdatePacket OurPacket; | 17 | //private ObjectUpdatePacket OurPacket; |
18 | private LLVector3 positionLastFrame = new LLVector3(0, 0, 0); | 18 | private LLVector3 positionLastFrame = new LLVector3(0, 0, 0); |
19 | private Dictionary<uint, SimClient> m_clientThreads; | 19 | private Dictionary<uint, ClientView> m_clientThreads; |
20 | private ulong m_regionHandle; | 20 | private ulong m_regionHandle; |
21 | private const uint FULL_MASK_PERMISSIONS = 2147483647; | 21 | private const uint FULL_MASK_PERMISSIONS = 2147483647; |
22 | private bool physicsEnabled = false; | 22 | private bool physicsEnabled = false; |
@@ -58,7 +58,7 @@ namespace OpenSim.world | |||
58 | } | 58 | } |
59 | #endregion | 59 | #endregion |
60 | 60 | ||
61 | public Primitive2(Dictionary<uint, SimClient> clientThreads, ulong regionHandle, World world) | 61 | public Primitive2(Dictionary<uint, ClientView> clientThreads, ulong regionHandle, World world) |
62 | { | 62 | { |
63 | m_clientThreads = clientThreads; | 63 | m_clientThreads = clientThreads; |
64 | m_regionHandle = regionHandle; | 64 | m_regionHandle = regionHandle; |
@@ -66,6 +66,17 @@ namespace OpenSim.world | |||
66 | inventoryItems = new Dictionary<LLUUID, InventoryItem>(); | 66 | inventoryItems = new Dictionary<LLUUID, InventoryItem>(); |
67 | } | 67 | } |
68 | 68 | ||
69 | public Primitive2(Dictionary<uint, ClientView> clientThreads, ulong regionHandle, World world, LLUUID owner) | ||
70 | { | ||
71 | m_clientThreads = clientThreads; | ||
72 | m_regionHandle = regionHandle; | ||
73 | m_world = world; | ||
74 | inventoryItems = new Dictionary<LLUUID, InventoryItem>(); | ||
75 | this.primData = new PrimData(); | ||
76 | this.primData.CreationDate = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; | ||
77 | this.primData.OwnerID = owner; | ||
78 | } | ||
79 | |||
69 | public byte[] GetByteArray() | 80 | public byte[] GetByteArray() |
70 | { | 81 | { |
71 | byte[] result = null; | 82 | byte[] result = null; |
@@ -159,7 +170,7 @@ namespace OpenSim.world | |||
159 | 170 | ||
160 | } | 171 | } |
161 | 172 | ||
162 | public void GetProperites(SimClient client) | 173 | public void GetProperites(ClientView client) |
163 | { | 174 | { |
164 | ObjectPropertiesPacket proper = new ObjectPropertiesPacket(); | 175 | ObjectPropertiesPacket proper = new ObjectPropertiesPacket(); |
165 | proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[1]; | 176 | proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[1]; |
@@ -202,12 +213,12 @@ namespace OpenSim.world | |||
202 | return null; | 213 | return null; |
203 | } | 214 | } |
204 | 215 | ||
205 | public void RequestInventoryInfo(SimClient simClient, RequestTaskInventoryPacket packet) | 216 | public void RequestInventoryInfo(ClientView simClient, RequestTaskInventoryPacket packet) |
206 | { | 217 | { |
207 | 218 | ||
208 | } | 219 | } |
209 | 220 | ||
210 | public void RequestXferInventory(SimClient simClient, ulong xferID) | 221 | public void RequestXferInventory(ClientView simClient, ulong xferID) |
211 | { | 222 | { |
212 | //will only currently work if the total size of the inventory data array is under about 1000 bytes | 223 | //will only currently work if the total size of the inventory data array is under about 1000 bytes |
213 | SendXferPacketPacket send = new SendXferPacketPacket(); | 224 | SendXferPacketPacket send = new SendXferPacketPacket(); |
@@ -246,7 +257,7 @@ namespace OpenSim.world | |||
246 | #region Update viewers Methods | 257 | #region Update viewers Methods |
247 | 258 | ||
248 | //should change these mehtods, so that outgoing packets are sent through the avatar class | 259 | //should change these mehtods, so that outgoing packets are sent through the avatar class |
249 | public void SendFullUpdateToClient(SimClient remoteClient) | 260 | public void SendFullUpdateToClient(ClientView remoteClient) |
250 | { | 261 | { |
251 | LLVector3 lPos; | 262 | LLVector3 lPos; |
252 | if (this._physActor != null && this.physicsEnabled) | 263 | if (this._physActor != null && this.physicsEnabled) |
@@ -273,7 +284,7 @@ namespace OpenSim.world | |||
273 | 284 | ||
274 | } | 285 | } |
275 | 286 | ||
276 | public void SendTerseUpdateToClient(SimClient RemoteClient) | 287 | public void SendTerseUpdateToClient(ClientView RemoteClient) |
277 | { | 288 | { |
278 | 289 | ||
279 | } | 290 | } |
@@ -316,7 +327,7 @@ namespace OpenSim.world | |||
316 | PData.PathTwist = addPacket.ObjectData.PathTwist; | 327 | PData.PathTwist = addPacket.ObjectData.PathTwist; |
317 | PData.PathTwistBegin = addPacket.ObjectData.PathTwistBegin; | 328 | PData.PathTwistBegin = addPacket.ObjectData.PathTwistBegin; |
318 | LLVector3 pos1 = addPacket.ObjectData.RayEnd; | 329 | LLVector3 pos1 = addPacket.ObjectData.RayEnd; |
319 | this.primData.FullID = this.uuid = LLUUID.Random(); | 330 | this.primData.FullID = this.uuid = LLUUID.Random(); |
320 | this.localid = (uint)(localID); | 331 | this.localid = (uint)(localID); |
321 | this.primData.Position = this.Pos = pos1; | 332 | this.primData.Position = this.Pos = pos1; |
322 | } | 333 | } |
diff --git a/OpenSim.RegionServer/world/SceneObject.cs b/OpenSim.RegionServer/world/SceneObject.cs index 5b5a7b2..a846fb5 100644 --- a/OpenSim.RegionServer/world/SceneObject.cs +++ b/OpenSim.RegionServer/world/SceneObject.cs | |||
@@ -15,7 +15,7 @@ namespace OpenSim.world | |||
15 | { | 15 | { |
16 | private LLUUID rootUUID; | 16 | private LLUUID rootUUID; |
17 | private Dictionary<LLUUID, Primitive2> ChildPrimitives = new Dictionary<LLUUID, Primitive2>(); | 17 | private Dictionary<LLUUID, Primitive2> ChildPrimitives = new Dictionary<LLUUID, Primitive2>(); |
18 | private Dictionary<uint, SimClient> m_clientThreads; | 18 | private Dictionary<uint, ClientView> m_clientThreads; |
19 | private World m_world; | 19 | private World m_world; |
20 | 20 | ||
21 | public SceneObject() | 21 | public SceneObject() |
@@ -42,7 +42,7 @@ namespace OpenSim.world | |||
42 | 42 | ||
43 | } | 43 | } |
44 | 44 | ||
45 | public void GetProperites(SimClient client) | 45 | public void GetProperites(ClientView client) |
46 | { | 46 | { |
47 | /* | 47 | /* |
48 | ObjectPropertiesPacket proper = new ObjectPropertiesPacket(); | 48 | ObjectPropertiesPacket proper = new ObjectPropertiesPacket(); |
diff --git a/OpenSim.RegionServer/world/World.PacketHandlers.cs b/OpenSim.RegionServer/world/World.PacketHandlers.cs index 175b777..27f200f 100644 --- a/OpenSim.RegionServer/world/World.PacketHandlers.cs +++ b/OpenSim.RegionServer/world/World.PacketHandlers.cs | |||
@@ -16,7 +16,7 @@ namespace OpenSim.world | |||
16 | public partial class World | 16 | public partial class World |
17 | { | 17 | { |
18 | 18 | ||
19 | public bool ModifyTerrain(SimClient simClient, Packet packet) | 19 | public bool ModifyTerrain(ClientView simClient, Packet packet) |
20 | { | 20 | { |
21 | ModifyLandPacket modify = (ModifyLandPacket)packet; | 21 | ModifyLandPacket modify = (ModifyLandPacket)packet; |
22 | 22 | ||
@@ -42,68 +42,44 @@ namespace OpenSim.world | |||
42 | return true; | 42 | return true; |
43 | } | 43 | } |
44 | 44 | ||
45 | public bool SimChat(SimClient simClient, Packet packet) | 45 | public void SimChat(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID) |
46 | { | 46 | { |
47 | System.Text.Encoding enc = System.Text.Encoding.ASCII; | 47 | foreach (ClientView client in m_clientThreads.Values) |
48 | ChatFromViewerPacket inchatpack = (ChatFromViewerPacket)packet; | ||
49 | if (Util.FieldToString(inchatpack.ChatData.Message) == "") | ||
50 | { | ||
51 | //empty message so don't bother with it | ||
52 | return true; | ||
53 | } | ||
54 | |||
55 | string fromName = simClient.ClientAvatar.firstname + " " + simClient.ClientAvatar.lastname; | ||
56 | byte[] message = inchatpack.ChatData.Message; | ||
57 | byte type = inchatpack.ChatData.Type; | ||
58 | LLVector3 fromPos = simClient.ClientAvatar.Pos; | ||
59 | LLUUID fromAgentID = simClient.AgentID; | ||
60 | |||
61 | libsecondlife.Packets.ChatFromSimulatorPacket reply = new ChatFromSimulatorPacket(); | ||
62 | reply.ChatData.Audible = 1; | ||
63 | reply.ChatData.Message = message; | ||
64 | reply.ChatData.ChatType = type; | ||
65 | reply.ChatData.SourceType = 1; | ||
66 | reply.ChatData.Position = fromPos; | ||
67 | reply.ChatData.FromName = enc.GetBytes(fromName + "\0"); | ||
68 | reply.ChatData.OwnerID = fromAgentID; | ||
69 | reply.ChatData.SourceID = fromAgentID; | ||
70 | |||
71 | foreach (SimClient client in m_clientThreads.Values) | ||
72 | { | 48 | { |
73 | // int dis = Util.fast_distance2d((int)(client.ClientAvatar.Pos.X - simClient.ClientAvatar.Pos.X), (int)(client.ClientAvatar.Pos.Y - simClient.ClientAvatar.Pos.Y)); | 49 | // int dis = Util.fast_distance2d((int)(client.ClientAvatar.Pos.X - simClient.ClientAvatar.Pos.X), (int)(client.ClientAvatar.Pos.Y - simClient.ClientAvatar.Pos.Y)); |
74 | int dis = (int)client.ClientAvatar.Pos.GetDistanceTo(simClient.ClientAvatar.Pos); | 50 | int dis = (int)client.ClientAvatar.Pos.GetDistanceTo(fromPos); |
75 | 51 | ||
76 | switch (inchatpack.ChatData.Type) | 52 | switch (type) |
77 | { | 53 | { |
78 | case 0: // Whisper | 54 | case 0: // Whisper |
79 | if ((dis < 10) && (dis > -10)) | 55 | if ((dis < 10) && (dis > -10)) |
80 | { | 56 | { |
81 | client.OutPacket(reply); | 57 | //should change so the message is sent through the avatar rather than direct to the ClientView |
58 | client.SendChatMessage(message, type, fromPos, fromName, fromAgentID); | ||
82 | } | 59 | } |
83 | break; | 60 | break; |
84 | case 1: // Say | 61 | case 1: // Say |
85 | if ((dis < 30) && (dis > -30)) | 62 | if ((dis < 30) && (dis > -30)) |
86 | { | 63 | { |
87 | client.OutPacket(reply); | 64 | client.SendChatMessage(message, type, fromPos, fromName, fromAgentID); |
88 | } | 65 | } |
89 | break; | 66 | break; |
90 | case 2: // Shout | 67 | case 2: // Shout |
91 | if ((dis < 100) && (dis > -100)) | 68 | if ((dis < 100) && (dis > -100)) |
92 | { | 69 | { |
93 | client.OutPacket(reply); | 70 | client.SendChatMessage(message, type, fromPos, fromName, fromAgentID); |
94 | } | 71 | } |
95 | break; | 72 | break; |
96 | 73 | ||
97 | case 0xff: // Broadcast | 74 | case 0xff: // Broadcast |
98 | client.OutPacket(reply); | 75 | client.SendChatMessage(message, type, fromPos, fromName, fromAgentID); |
99 | break; | 76 | break; |
100 | } | 77 | } |
101 | 78 | ||
102 | } | 79 | } |
103 | return true; | ||
104 | } | 80 | } |
105 | 81 | ||
106 | public bool RezObject(SimClient simClient, Packet packet) | 82 | public bool RezObject(ClientView simClient, Packet packet) |
107 | { | 83 | { |
108 | RezObjectPacket rezPacket = (RezObjectPacket)packet; | 84 | RezObjectPacket rezPacket = (RezObjectPacket)packet; |
109 | AgentInventory inven = this._inventoryCache.GetAgentsInventory(simClient.AgentID); | 85 | AgentInventory inven = this._inventoryCache.GetAgentsInventory(simClient.AgentID); |
@@ -126,7 +102,7 @@ namespace OpenSim.world | |||
126 | return true; | 102 | return true; |
127 | } | 103 | } |
128 | 104 | ||
129 | public bool DeRezObject(SimClient simClient, Packet packet) | 105 | public bool DeRezObject(ClientView simClient, Packet packet) |
130 | { | 106 | { |
131 | DeRezObjectPacket DeRezPacket = (DeRezObjectPacket)packet; | 107 | DeRezObjectPacket DeRezPacket = (DeRezObjectPacket)packet; |
132 | 108 | ||
@@ -151,7 +127,7 @@ namespace OpenSim.world | |||
151 | kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1]; | 127 | kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1]; |
152 | kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock(); | 128 | kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock(); |
153 | kill.ObjectData[0].ID = ent.localid; | 129 | kill.ObjectData[0].ID = ent.localid; |
154 | foreach (SimClient client in m_clientThreads.Values) | 130 | foreach (ClientView client in m_clientThreads.Values) |
155 | { | 131 | { |
156 | client.OutPacket(kill); | 132 | client.OutPacket(kill); |
157 | } | 133 | } |
@@ -201,7 +177,7 @@ namespace OpenSim.world | |||
201 | kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1]; | 177 | kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1]; |
202 | kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock(); | 178 | kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock(); |
203 | kill.ObjectData[0].ID = selectedEnt.localid; | 179 | kill.ObjectData[0].ID = selectedEnt.localid; |
204 | foreach (SimClient client in m_clientThreads.Values) | 180 | foreach (ClientView client in m_clientThreads.Values) |
205 | { | 181 | { |
206 | client.OutPacket(kill); | 182 | client.OutPacket(kill); |
207 | } | 183 | } |
@@ -215,7 +191,7 @@ namespace OpenSim.world | |||
215 | return true; | 191 | return true; |
216 | } | 192 | } |
217 | 193 | ||
218 | public void RequestMapBlock(SimClient simClient, int minX, int minY, int maxX, int maxY) | 194 | public void RequestMapBlock(ClientView simClient, int minX, int minY, int maxX, int maxY) |
219 | { | 195 | { |
220 | System.Text.Encoding _enc = System.Text.Encoding.ASCII; | 196 | System.Text.Encoding _enc = System.Text.Encoding.ASCII; |
221 | if (((m_regInfo.RegionLocX > minX) && (m_regInfo.RegionLocX < maxX)) && ((m_regInfo.RegionLocY > minY) && (m_regInfo.RegionLocY < maxY))) | 197 | if (((m_regInfo.RegionLocX > minX) && (m_regInfo.RegionLocX < maxX)) && ((m_regInfo.RegionLocY > minY) && (m_regInfo.RegionLocY < maxY))) |
diff --git a/OpenSim.RegionServer/world/World.cs b/OpenSim.RegionServer/world/World.cs index 983e66d..c90e3f6 100644 --- a/OpenSim.RegionServer/world/World.cs +++ b/OpenSim.RegionServer/world/World.cs | |||
@@ -57,7 +57,7 @@ namespace OpenSim.world | |||
57 | /// <param name="clientThreads">Dictionary to contain client threads</param> | 57 | /// <param name="clientThreads">Dictionary to contain client threads</param> |
58 | /// <param name="regionHandle">Region Handle for this region</param> | 58 | /// <param name="regionHandle">Region Handle for this region</param> |
59 | /// <param name="regionName">Region Name for this region</param> | 59 | /// <param name="regionName">Region Name for this region</param> |
60 | public World(Dictionary<uint, SimClient> clientThreads, RegionInfo regInfo, ulong regionHandle, string regionName) | 60 | public World(Dictionary<uint, ClientView> clientThreads, RegionInfo regInfo, ulong regionHandle, string regionName) |
61 | { | 61 | { |
62 | try | 62 | try |
63 | { | 63 | { |
@@ -324,7 +324,7 @@ namespace OpenSim.world | |||
324 | } | 324 | } |
325 | this.localStorage.SaveMap(this.Terrain.getHeights1D()); | 325 | this.localStorage.SaveMap(this.Terrain.getHeights1D()); |
326 | 326 | ||
327 | foreach (SimClient client in m_clientThreads.Values) | 327 | foreach (ClientView client in m_clientThreads.Values) |
328 | { | 328 | { |
329 | this.SendLayerData(client); | 329 | this.SendLayerData(client); |
330 | } | 330 | } |
@@ -355,7 +355,7 @@ namespace OpenSim.world | |||
355 | } | 355 | } |
356 | this.localStorage.SaveMap(this.Terrain.getHeights1D()); | 356 | this.localStorage.SaveMap(this.Terrain.getHeights1D()); |
357 | 357 | ||
358 | foreach (SimClient client in m_clientThreads.Values) | 358 | foreach (ClientView client in m_clientThreads.Values) |
359 | { | 359 | { |
360 | this.SendLayerData(client); | 360 | this.SendLayerData(client); |
361 | } | 361 | } |
@@ -389,7 +389,7 @@ namespace OpenSim.world | |||
389 | } | 389 | } |
390 | this.localStorage.SaveMap(this.Terrain.getHeights1D()); | 390 | this.localStorage.SaveMap(this.Terrain.getHeights1D()); |
391 | 391 | ||
392 | foreach (SimClient client in m_clientThreads.Values) | 392 | foreach (ClientView client in m_clientThreads.Values) |
393 | { | 393 | { |
394 | this.SendLayerData(pointx, pointy, client); | 394 | this.SendLayerData(pointx, pointy, client); |
395 | } | 395 | } |
@@ -437,7 +437,7 @@ namespace OpenSim.world | |||
437 | /// Sends prims to a client | 437 | /// Sends prims to a client |
438 | /// </summary> | 438 | /// </summary> |
439 | /// <param name="RemoteClient">Client to send to</param> | 439 | /// <param name="RemoteClient">Client to send to</param> |
440 | public void GetInitialPrims(SimClient RemoteClient) | 440 | public void GetInitialPrims(ClientView RemoteClient) |
441 | { | 441 | { |
442 | try | 442 | try |
443 | { | 443 | { |
@@ -495,7 +495,7 @@ namespace OpenSim.world | |||
495 | } | 495 | } |
496 | } | 496 | } |
497 | 497 | ||
498 | public void AddNewPrim(ObjectAddPacket addPacket, SimClient AgentClient) | 498 | public void AddNewPrim(ObjectAddPacket addPacket, ClientView AgentClient) |
499 | { | 499 | { |
500 | AddNewPrim(addPacket, AgentClient.AgentID); | 500 | AddNewPrim(addPacket, AgentClient.AgentID); |
501 | } | 501 | } |
@@ -530,8 +530,9 @@ namespace OpenSim.world | |||
530 | 530 | ||
531 | #region Add/Remove Avatar Methods | 531 | #region Add/Remove Avatar Methods |
532 | 532 | ||
533 | public override void AddViewerAgent(SimClient agentClient) | 533 | public override void AddViewerAgent(ClientView agentClient) |
534 | { | 534 | { |
535 | agentClient.OnChatFromViewer += new ClientView.ChatFromViewer(this.SimChat); | ||
535 | try | 536 | try |
536 | { | 537 | { |
537 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.LOW, "World.cs:AddViewerAgent() - Creating new avatar for remote viewer agent"); | 538 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.LOW, "World.cs:AddViewerAgent() - Creating new avatar for remote viewer agent"); |
@@ -576,7 +577,7 @@ namespace OpenSim.world | |||
576 | } | 577 | } |
577 | } | 578 | } |
578 | 579 | ||
579 | public override void RemoveViewerAgent(SimClient agentClient) | 580 | public override void RemoveViewerAgent(ClientView agentClient) |
580 | { | 581 | { |
581 | try | 582 | try |
582 | { | 583 | { |
@@ -600,6 +601,23 @@ namespace OpenSim.world | |||
600 | } | 601 | } |
601 | #endregion | 602 | #endregion |
602 | 603 | ||
604 | #region Request Avatars List Methods | ||
605 | //The idea is to have a group of method that return a list of avatars meeting some requirement | ||
606 | // ie it could be all Avatars within a certain range of the calling prim/avatar. | ||
607 | |||
608 | public List<Avatar> RequestAvatarList() | ||
609 | { | ||
610 | List<Avatar> result = new List<Avatar>(); | ||
611 | |||
612 | foreach (Avatar avatar in Avatars.Values) | ||
613 | { | ||
614 | result.Add(avatar); | ||
615 | } | ||
616 | |||
617 | return result; | ||
618 | } | ||
619 | #endregion | ||
620 | |||
603 | #region ShutDown | 621 | #region ShutDown |
604 | /// <summary> | 622 | /// <summary> |
605 | /// Tidy before shutdown | 623 | /// Tidy before shutdown |
diff --git a/OpenSim.RegionServer/world/WorldBase.cs b/OpenSim.RegionServer/world/WorldBase.cs index b8c086d..edc5518 100644 --- a/OpenSim.RegionServer/world/WorldBase.cs +++ b/OpenSim.RegionServer/world/WorldBase.cs | |||
@@ -20,7 +20,7 @@ namespace OpenSim.world | |||
20 | public class WorldBase | 20 | public class WorldBase |
21 | { | 21 | { |
22 | public Dictionary<libsecondlife.LLUUID, Entity> Entities; | 22 | public Dictionary<libsecondlife.LLUUID, Entity> Entities; |
23 | protected Dictionary<uint, SimClient> m_clientThreads; | 23 | protected Dictionary<uint, ClientView> m_clientThreads; |
24 | protected ulong m_regionHandle; | 24 | protected ulong m_regionHandle; |
25 | protected string m_regionName; | 25 | protected string m_regionName; |
26 | protected InventoryCache _inventoryCache; | 26 | protected InventoryCache _inventoryCache; |
@@ -90,7 +90,7 @@ namespace OpenSim.world | |||
90 | /// Send the region heightmap to the client | 90 | /// Send the region heightmap to the client |
91 | /// </summary> | 91 | /// </summary> |
92 | /// <param name="RemoteClient">Client to send to</param> | 92 | /// <param name="RemoteClient">Client to send to</param> |
93 | public virtual void SendLayerData(SimClient RemoteClient) | 93 | public virtual void SendLayerData(ClientView RemoteClient) |
94 | { | 94 | { |
95 | try | 95 | try |
96 | { | 96 | { |
@@ -122,7 +122,7 @@ namespace OpenSim.world | |||
122 | /// <param name="px">Patch coordinate (x) 0..16</param> | 122 | /// <param name="px">Patch coordinate (x) 0..16</param> |
123 | /// <param name="py">Patch coordinate (y) 0..16</param> | 123 | /// <param name="py">Patch coordinate (y) 0..16</param> |
124 | /// <param name="RemoteClient">The client to send to</param> | 124 | /// <param name="RemoteClient">The client to send to</param> |
125 | public void SendLayerData(int px, int py, SimClient RemoteClient) | 125 | public void SendLayerData(int px, int py, ClientView RemoteClient) |
126 | { | 126 | { |
127 | try | 127 | try |
128 | { | 128 | { |
@@ -148,7 +148,7 @@ namespace OpenSim.world | |||
148 | /// Add a new Agent's avatar | 148 | /// Add a new Agent's avatar |
149 | /// </summary> | 149 | /// </summary> |
150 | /// <param name="agentClient"></param> | 150 | /// <param name="agentClient"></param> |
151 | public virtual void AddViewerAgent(SimClient agentClient) | 151 | public virtual void AddViewerAgent(ClientView agentClient) |
152 | { | 152 | { |
153 | 153 | ||
154 | } | 154 | } |
@@ -157,7 +157,7 @@ namespace OpenSim.world | |||
157 | /// Remove a Agent's avatar | 157 | /// Remove a Agent's avatar |
158 | /// </summary> | 158 | /// </summary> |
159 | /// <param name="agentClient"></param> | 159 | /// <param name="agentClient"></param> |
160 | public virtual void RemoveViewerAgent(SimClient agentClient) | 160 | public virtual void RemoveViewerAgent(ClientView agentClient) |
161 | { | 161 | { |
162 | 162 | ||
163 | } | 163 | } |