diff options
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 'OpenSim.RegionServer/ClientView.ProcessPackets.cs')
-rw-r--r-- | OpenSim.RegionServer/ClientView.ProcessPackets.cs | 443 |
1 files changed, 443 insertions, 0 deletions
diff --git a/OpenSim.RegionServer/ClientView.ProcessPackets.cs b/OpenSim.RegionServer/ClientView.ProcessPackets.cs new file mode 100644 index 0000000..0079d96 --- /dev/null +++ b/OpenSim.RegionServer/ClientView.ProcessPackets.cs | |||
@@ -0,0 +1,443 @@ | |||
1 | using System; | ||
2 | using System.Collections; | ||
3 | using System.Collections.Generic; | ||
4 | using libsecondlife; | ||
5 | using libsecondlife.Packets; | ||
6 | using Nwc.XmlRpc; | ||
7 | using System.Net; | ||
8 | using System.Net.Sockets; | ||
9 | using System.IO; | ||
10 | using System.Threading; | ||
11 | using System.Timers; | ||
12 | using OpenSim.Framework.Interfaces; | ||
13 | using OpenSim.Framework.Types; | ||
14 | using OpenSim.Framework.Inventory; | ||
15 | using OpenSim.Framework.Utilities; | ||
16 | using OpenSim.world; | ||
17 | using OpenSim.Assets; | ||
18 | |||
19 | namespace OpenSim | ||
20 | { | ||
21 | public partial class ClientView | ||
22 | { | ||
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) | ||
29 | { | ||
30 | ack_pack(Pack); | ||
31 | if (debug) | ||
32 | { | ||
33 | if (Pack.Type != PacketType.AgentUpdate) | ||
34 | { | ||
35 | Console.WriteLine(Pack.Type.ToString()); | ||
36 | } | ||
37 | } | ||
38 | |||
39 | if (this.ProcessPacketMethod(Pack)) | ||
40 | { | ||
41 | //there is a handler registered that handled this packet type | ||
42 | return; | ||
43 | } | ||
44 | else | ||
45 | { | ||
46 | System.Text.Encoding _enc = System.Text.Encoding.ASCII; | ||
47 | |||
48 | switch (Pack.Type) | ||
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 | ||
68 | case PacketType.CompleteAgentMovement: | ||
69 | if (this.m_child) this.UpgradeClient(); | ||
70 | ClientAvatar.CompleteMovement(m_world); | ||
71 | ClientAvatar.SendInitialPosition(); | ||
72 | this.EnableNeighbours(); | ||
73 | break; | ||
74 | case PacketType.RegionHandshakeReply: | ||
75 | m_world.SendLayerData(this); | ||
76 | break; | ||
77 | case PacketType.AgentWearablesRequest: | ||
78 | ClientAvatar.SendInitialAppearance(); | ||
79 | foreach (ClientView client in m_clientThreads.Values) | ||
80 | { | ||
81 | if (client.AgentID != this.AgentID) | ||
82 | { | ||
83 | ObjectUpdatePacket objupdate = client.ClientAvatar.CreateUpdatePacket(); | ||
84 | this.OutPacket(objupdate); | ||
85 | client.ClientAvatar.SendAppearanceToOtherAgent(this.ClientAvatar); | ||
86 | } | ||
87 | } | ||
88 | m_world.GetInitialPrims(this); | ||
89 | break; | ||
90 | case PacketType.AgentIsNowWearing: | ||
91 | AgentIsNowWearingPacket wear = (AgentIsNowWearingPacket)Pack; | ||
92 | //Console.WriteLine(Pack.ToString()); | ||
93 | break; | ||
94 | case PacketType.AgentSetAppearance: | ||
95 | AgentSetAppearancePacket appear = (AgentSetAppearancePacket)Pack; | ||
96 | // Console.WriteLine(appear.ToString()); | ||
97 | this.ClientAvatar.SetAppearance(appear); | ||
98 | break; | ||
99 | case PacketType.ObjectAdd: | ||
100 | m_world.AddNewPrim((ObjectAddPacket)Pack, this); | ||
101 | break; | ||
102 | case PacketType.ObjectLink: | ||
103 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.LOW, Pack.ToString()); | ||
104 | ObjectLinkPacket link = (ObjectLinkPacket)Pack; | ||
105 | uint parentprimid = 0; | ||
106 | OpenSim.world.Primitive parentprim = null; | ||
107 | if (link.ObjectData.Length > 1) | ||
108 | { | ||
109 | parentprimid = link.ObjectData[0].ObjectLocalID; | ||
110 | foreach (Entity ent in m_world.Entities.Values) | ||
111 | { | ||
112 | if (ent.localid == parentprimid) | ||
113 | { | ||
114 | parentprim = (OpenSim.world.Primitive)ent; | ||
115 | |||
116 | } | ||
117 | } | ||
118 | for (int i = 1; i < link.ObjectData.Length; i++) | ||
119 | { | ||
120 | foreach (Entity ent in m_world.Entities.Values) | ||
121 | { | ||
122 | if (ent.localid == link.ObjectData[i].ObjectLocalID) | ||
123 | { | ||
124 | ((OpenSim.world.Primitive)ent).MakeParent(parentprim); | ||
125 | } | ||
126 | } | ||
127 | } | ||
128 | } | ||
129 | break; | ||
130 | case PacketType.ObjectScale: | ||
131 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.LOW, Pack.ToString()); | ||
132 | break; | ||
133 | case PacketType.ObjectShape: | ||
134 | ObjectShapePacket shape = (ObjectShapePacket)Pack; | ||
135 | for (int i = 0; i < shape.ObjectData.Length; i++) | ||
136 | { | ||
137 | foreach (Entity ent in m_world.Entities.Values) | ||
138 | { | ||
139 | if (ent.localid == shape.ObjectData[i].ObjectLocalID) | ||
140 | { | ||
141 | ((OpenSim.world.Primitive)ent).UpdateShape(shape.ObjectData[i]); | ||
142 | } | ||
143 | } | ||
144 | } | ||
145 | break; | ||
146 | case PacketType.AgentUpdate: | ||
147 | ClientAvatar.HandleUpdate((AgentUpdatePacket)Pack); | ||
148 | break; | ||
149 | case PacketType.ObjectImage: | ||
150 | ObjectImagePacket imagePack = (ObjectImagePacket)Pack; | ||
151 | for (int i = 0; i < imagePack.ObjectData.Length; i++) | ||
152 | { | ||
153 | foreach (Entity ent in m_world.Entities.Values) | ||
154 | { | ||
155 | if (ent.localid == imagePack.ObjectData[i].ObjectLocalID) | ||
156 | { | ||
157 | ((OpenSim.world.Primitive)ent).UpdateTexture(imagePack.ObjectData[i].TextureEntry); | ||
158 | } | ||
159 | } | ||
160 | } | ||
161 | break; | ||
162 | case PacketType.ObjectFlagUpdate: | ||
163 | ObjectFlagUpdatePacket flags = (ObjectFlagUpdatePacket)Pack; | ||
164 | foreach (Entity ent in m_world.Entities.Values) | ||
165 | { | ||
166 | if (ent.localid == flags.AgentData.ObjectLocalID) | ||
167 | { | ||
168 | ((OpenSim.world.Primitive)ent).UpdateObjectFlags(flags); | ||
169 | } | ||
170 | } | ||
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; | ||
228 | case PacketType.AssetUploadRequest: | ||
229 | AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack; | ||
230 | this.UploadAssets.HandleUploadPacket(request, request.AssetBlock.TransactionID.Combine(this.SecureSessionID)); | ||
231 | break; | ||
232 | case PacketType.RequestXfer: | ||
233 | //Console.WriteLine(Pack.ToString()); | ||
234 | break; | ||
235 | case PacketType.SendXferPacket: | ||
236 | this.UploadAssets.HandleXferPacket((SendXferPacketPacket)Pack); | ||
237 | break; | ||
238 | case PacketType.CreateInventoryFolder: | ||
239 | CreateInventoryFolderPacket invFolder = (CreateInventoryFolderPacket)Pack; | ||
240 | m_inventoryCache.CreateNewInventoryFolder(this, invFolder.FolderData.FolderID, (ushort)invFolder.FolderData.Type, Util.FieldToString(invFolder.FolderData.Name), invFolder.FolderData.ParentID); | ||
241 | //Console.WriteLine(Pack.ToString()); | ||
242 | break; | ||
243 | case PacketType.CreateInventoryItem: | ||
244 | //Console.WriteLine(Pack.ToString()); | ||
245 | CreateInventoryItemPacket createItem = (CreateInventoryItemPacket)Pack; | ||
246 | if (createItem.InventoryBlock.TransactionID != LLUUID.Zero) | ||
247 | { | ||
248 | this.UploadAssets.CreateInventoryItem(createItem); | ||
249 | } | ||
250 | else | ||
251 | { | ||
252 | // Console.Write(Pack.ToString()); | ||
253 | this.CreateInventoryItem(createItem); | ||
254 | } | ||
255 | break; | ||
256 | case PacketType.FetchInventory: | ||
257 | //Console.WriteLine("fetch item packet"); | ||
258 | FetchInventoryPacket FetchInventory = (FetchInventoryPacket)Pack; | ||
259 | m_inventoryCache.FetchInventory(this, FetchInventory); | ||
260 | break; | ||
261 | case PacketType.FetchInventoryDescendents: | ||
262 | FetchInventoryDescendentsPacket Fetch = (FetchInventoryDescendentsPacket)Pack; | ||
263 | m_inventoryCache.FetchInventoryDescendents(this, Fetch); | ||
264 | break; | ||
265 | case PacketType.UpdateInventoryItem: | ||
266 | UpdateInventoryItemPacket update = (UpdateInventoryItemPacket)Pack; | ||
267 | //Console.WriteLine(Pack.ToString()); | ||
268 | for (int i = 0; i < update.InventoryData.Length; i++) | ||
269 | { | ||
270 | if (update.InventoryData[i].TransactionID != LLUUID.Zero) | ||
271 | { | ||
272 | AssetBase asset = m_assetCache.GetAsset(update.InventoryData[i].TransactionID.Combine(this.SecureSessionID)); | ||
273 | if (asset != null) | ||
274 | { | ||
275 | // Console.WriteLine("updating inventory item, found asset" + asset.FullID.ToStringHyphenated() + " already in cache"); | ||
276 | m_inventoryCache.UpdateInventoryItemAsset(this, update.InventoryData[i].ItemID, asset); | ||
277 | } | ||
278 | else | ||
279 | { | ||
280 | asset = this.UploadAssets.AddUploadToAssetCache(update.InventoryData[i].TransactionID); | ||
281 | if (asset != null) | ||
282 | { | ||
283 | //Console.WriteLine("updating inventory item, adding asset" + asset.FullID.ToStringHyphenated() + " to cache"); | ||
284 | m_inventoryCache.UpdateInventoryItemAsset(this, update.InventoryData[i].ItemID, asset); | ||
285 | } | ||
286 | else | ||
287 | { | ||
288 | //Console.WriteLine("trying to update inventory item, but asset is null"); | ||
289 | } | ||
290 | } | ||
291 | } | ||
292 | else | ||
293 | { | ||
294 | m_inventoryCache.UpdateInventoryItemDetails(this, update.InventoryData[i].ItemID, update.InventoryData[i]); ; | ||
295 | } | ||
296 | } | ||
297 | break; | ||
298 | case PacketType.RequestTaskInventory: | ||
299 | // Console.WriteLine(Pack.ToString()); | ||
300 | RequestTaskInventoryPacket requesttask = (RequestTaskInventoryPacket)Pack; | ||
301 | ReplyTaskInventoryPacket replytask = new ReplyTaskInventoryPacket(); | ||
302 | bool foundent = false; | ||
303 | foreach (Entity ent in m_world.Entities.Values) | ||
304 | { | ||
305 | if (ent.localid == requesttask.InventoryData.LocalID) | ||
306 | { | ||
307 | replytask.InventoryData.TaskID = ent.uuid; | ||
308 | replytask.InventoryData.Serial = 0; | ||
309 | replytask.InventoryData.Filename = new byte[0]; | ||
310 | foundent = true; | ||
311 | } | ||
312 | } | ||
313 | if (foundent) | ||
314 | { | ||
315 | this.OutPacket(replytask); | ||
316 | } | ||
317 | break; | ||
318 | case PacketType.UpdateTaskInventory: | ||
319 | // Console.WriteLine(Pack.ToString()); | ||
320 | UpdateTaskInventoryPacket updatetask = (UpdateTaskInventoryPacket)Pack; | ||
321 | AgentInventory myinventory = this.m_inventoryCache.GetAgentsInventory(this.AgentID); | ||
322 | if (myinventory != null) | ||
323 | { | ||
324 | if (updatetask.UpdateData.Key == 0) | ||
325 | { | ||
326 | if (myinventory.InventoryItems[updatetask.InventoryData.ItemID] != null) | ||
327 | { | ||
328 | if (myinventory.InventoryItems[updatetask.InventoryData.ItemID].Type == 7) | ||
329 | { | ||
330 | LLUUID noteaid = myinventory.InventoryItems[updatetask.InventoryData.ItemID].AssetID; | ||
331 | AssetBase assBase = this.m_assetCache.GetAsset(noteaid); | ||
332 | if (assBase != null) | ||
333 | { | ||
334 | foreach (Entity ent in m_world.Entities.Values) | ||
335 | { | ||
336 | if (ent.localid == updatetask.UpdateData.LocalID) | ||
337 | { | ||
338 | if (ent is OpenSim.world.Primitive) | ||
339 | { | ||
340 | this.m_world.AddScript(ent, Util.FieldToString(assBase.Data)); | ||
341 | } | ||
342 | } | ||
343 | } | ||
344 | } | ||
345 | } | ||
346 | } | ||
347 | } | ||
348 | } | ||
349 | break; | ||
350 | case PacketType.MapLayerRequest: | ||
351 | this.RequestMapLayer(); | ||
352 | break; | ||
353 | case PacketType.MapBlockRequest: | ||
354 | MapBlockRequestPacket MapRequest = (MapBlockRequestPacket)Pack; | ||
355 | |||
356 | this.RequestMapBlocks(MapRequest.PositionData.MinX, MapRequest.PositionData.MinY, MapRequest.PositionData.MaxX, MapRequest.PositionData.MaxY); | ||
357 | break; | ||
358 | case PacketType.TeleportLandmarkRequest: | ||
359 | TeleportLandmarkRequestPacket tpReq = (TeleportLandmarkRequestPacket)Pack; | ||
360 | |||
361 | TeleportStartPacket tpStart = new TeleportStartPacket(); | ||
362 | tpStart.Info.TeleportFlags = 8; // tp via lm | ||
363 | this.OutPacket(tpStart); | ||
364 | |||
365 | TeleportProgressPacket tpProgress = new TeleportProgressPacket(); | ||
366 | tpProgress.Info.Message = (new System.Text.ASCIIEncoding()).GetBytes("sending_landmark"); | ||
367 | tpProgress.Info.TeleportFlags = 8; | ||
368 | tpProgress.AgentData.AgentID = tpReq.Info.AgentID; | ||
369 | this.OutPacket(tpProgress); | ||
370 | |||
371 | // Fetch landmark | ||
372 | LLUUID lmid = tpReq.Info.LandmarkID; | ||
373 | AssetBase lma = this.m_assetCache.GetAsset(lmid); | ||
374 | if (lma != null) | ||
375 | { | ||
376 | AssetLandmark lm = new AssetLandmark(lma); | ||
377 | |||
378 | if (lm.RegionID == m_regionData.SimUUID) | ||
379 | { | ||
380 | TeleportLocalPacket tpLocal = new TeleportLocalPacket(); | ||
381 | |||
382 | tpLocal.Info.AgentID = tpReq.Info.AgentID; | ||
383 | tpLocal.Info.TeleportFlags = 8; // Teleport via landmark | ||
384 | tpLocal.Info.LocationID = 2; | ||
385 | tpLocal.Info.Position = lm.Position; | ||
386 | OutPacket(tpLocal); | ||
387 | } | ||
388 | else | ||
389 | { | ||
390 | TeleportCancelPacket tpCancel = new TeleportCancelPacket(); | ||
391 | tpCancel.Info.AgentID = tpReq.Info.AgentID; | ||
392 | tpCancel.Info.SessionID = tpReq.Info.SessionID; | ||
393 | OutPacket(tpCancel); | ||
394 | } | ||
395 | } | ||
396 | else | ||
397 | { | ||
398 | Console.WriteLine("Cancelling Teleport - fetch asset not yet implemented"); | ||
399 | |||
400 | TeleportCancelPacket tpCancel = new TeleportCancelPacket(); | ||
401 | tpCancel.Info.AgentID = tpReq.Info.AgentID; | ||
402 | tpCancel.Info.SessionID = tpReq.Info.SessionID; | ||
403 | OutPacket(tpCancel); | ||
404 | } | ||
405 | break; | ||
406 | case PacketType.TeleportLocationRequest: | ||
407 | TeleportLocationRequestPacket tpLocReq = (TeleportLocationRequestPacket)Pack; | ||
408 | Console.WriteLine(tpLocReq.ToString()); | ||
409 | |||
410 | tpStart = new TeleportStartPacket(); | ||
411 | tpStart.Info.TeleportFlags = 16; // Teleport via location | ||
412 | Console.WriteLine(tpStart.ToString()); | ||
413 | OutPacket(tpStart); | ||
414 | |||
415 | if (m_regionData.RegionHandle != tpLocReq.Info.RegionHandle) | ||
416 | { | ||
417 | /* m_gridServer.getRegion(tpLocReq.Info.RegionHandle); */ | ||
418 | Console.WriteLine("Inter-sim teleport not yet implemented"); | ||
419 | TeleportCancelPacket tpCancel = new TeleportCancelPacket(); | ||
420 | tpCancel.Info.SessionID = tpLocReq.AgentData.SessionID; | ||
421 | tpCancel.Info.AgentID = tpLocReq.AgentData.AgentID; | ||
422 | |||
423 | OutPacket(tpCancel); | ||
424 | } | ||
425 | else | ||
426 | { | ||
427 | Console.WriteLine("Local teleport"); | ||
428 | TeleportLocalPacket tpLocal = new TeleportLocalPacket(); | ||
429 | tpLocal.Info.AgentID = tpLocReq.AgentData.AgentID; | ||
430 | tpLocal.Info.TeleportFlags = tpStart.Info.TeleportFlags; | ||
431 | tpLocal.Info.LocationID = 2; | ||
432 | tpLocal.Info.LookAt = tpLocReq.Info.LookAt; | ||
433 | tpLocal.Info.Position = tpLocReq.Info.Position; | ||
434 | OutPacket(tpLocal); | ||
435 | |||
436 | } | ||
437 | break; | ||
438 | #endregion | ||
439 | } | ||
440 | } | ||
441 | } | ||
442 | } | ||
443 | } | ||