aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/OpenSim.RegionServer/ClientView.API.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/OpenSim.RegionServer/ClientView.API.cs')
-rw-r--r--OpenSim/OpenSim.RegionServer/ClientView.API.cs251
1 files changed, 171 insertions, 80 deletions
diff --git a/OpenSim/OpenSim.RegionServer/ClientView.API.cs b/OpenSim/OpenSim.RegionServer/ClientView.API.cs
index f59e170..fe46fcb 100644
--- a/OpenSim/OpenSim.RegionServer/ClientView.API.cs
+++ b/OpenSim/OpenSim.RegionServer/ClientView.API.cs
@@ -182,56 +182,7 @@ namespace OpenSim
182 this.OutPacket(reply); 182 this.OutPacket(reply);
183 } 183 }
184 184
185 /// <summary> 185
186 ///
187 /// </summary>
188 /// <param name="wearables"></param>
189 public void SendWearables(AvatarWearable[] wearables)
190 {
191 AgentWearablesUpdatePacket aw = new AgentWearablesUpdatePacket();
192 aw.AgentData.AgentID = this.AgentID;
193 aw.AgentData.SerialNum = 0;
194 aw.AgentData.SessionID = this.SessionID;
195
196 aw.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[13];
197 AgentWearablesUpdatePacket.WearableDataBlock awb;
198 for (int i = 0; i < wearables.Length; i++)
199 {
200 awb = new AgentWearablesUpdatePacket.WearableDataBlock();
201 awb.WearableType = (byte)i;
202 awb.AssetID = wearables[i].AssetID;
203 awb.ItemID = wearables[i].ItemID;
204 aw.WearableData[i] = awb;
205 }
206
207 this.OutPacket(aw);
208 }
209
210 /// <summary>
211 ///
212 /// </summary>
213 /// <param name="agentID"></param>
214 /// <param name="visualParams"></param>
215 /// <param name="textureEntry"></param>
216 public void SendAppearance(LLUUID agentID, byte[] visualParams, byte[] textureEntry)
217 {
218 AvatarAppearancePacket avp = new AvatarAppearancePacket();
219 avp.VisualParam = new AvatarAppearancePacket.VisualParamBlock[218];
220 avp.ObjectData.TextureEntry = textureEntry;
221
222 AvatarAppearancePacket.VisualParamBlock avblock = null;
223 for (int i = 0; i < visualParams.Length; i++)
224 {
225 avblock = new AvatarAppearancePacket.VisualParamBlock();
226 avblock.ParamValue = visualParams[i];
227 avp.VisualParam[i] = avblock;
228 }
229
230 avp.Sender.IsTrial = false;
231 avp.Sender.ID = agentID;
232 OutPacket(avp);
233 }
234
235 /// <summary> 186 /// <summary>
236 /// Send the region heightmap to the client 187 /// Send the region heightmap to the client
237 /// </summary> 188 /// </summary>
@@ -287,7 +238,91 @@ namespace OpenSim
287 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.MEDIUM, "ClientView API .cs: SendLayerData() - Failed with exception " + e.ToString()); 238 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.MEDIUM, "ClientView API .cs: SendLayerData() - Failed with exception " + e.ToString());
288 } 239 }
289 } 240 }
241
242 public void InformClientOfNeighbour(ulong neighbourHandle, System.Net.IPAddress neighbourIP, ushort neighbourPort)
243 {
244 EnableSimulatorPacket enablesimpacket = new EnableSimulatorPacket();
245 enablesimpacket.SimulatorInfo = new EnableSimulatorPacket.SimulatorInfoBlock();
246 enablesimpacket.SimulatorInfo.Handle = neighbourHandle;
247
248 byte[] byteIP = neighbourIP.GetAddressBytes();
249 enablesimpacket.SimulatorInfo.IP = (uint)byteIP[3] << 24;
250 enablesimpacket.SimulatorInfo.IP += (uint)byteIP[2] << 16;
251 enablesimpacket.SimulatorInfo.IP += (uint)byteIP[1] << 8;
252 enablesimpacket.SimulatorInfo.IP += (uint)byteIP[0];
253 enablesimpacket.SimulatorInfo.Port = neighbourPort;
254 OutPacket(enablesimpacket);
255 }
256
257 public AgentCircuitData RequestClientInfo()
258 {
259 AgentCircuitData agentData = new AgentCircuitData();
260 agentData.AgentID = this.AgentId;
261 agentData.SessionID = this.SessionID;
262 agentData.SecureSessionID = this.SecureSessionID;
263 agentData.circuitcode = this.CircuitCode;
264 agentData.child = false;
265 agentData.firstname = this.firstName;
266 agentData.lastname = this.lastName;
267
268 return agentData;
269 }
270
271 #region Appearance/ Wearables Methods
272
273 /// <summary>
274 ///
275 /// </summary>
276 /// <param name="wearables"></param>
277 public void SendWearables(AvatarWearable[] wearables)
278 {
279 AgentWearablesUpdatePacket aw = new AgentWearablesUpdatePacket();
280 aw.AgentData.AgentID = this.AgentID;
281 aw.AgentData.SerialNum = 0;
282 aw.AgentData.SessionID = this.SessionID;
283
284 aw.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[13];
285 AgentWearablesUpdatePacket.WearableDataBlock awb;
286 for (int i = 0; i < wearables.Length; i++)
287 {
288 awb = new AgentWearablesUpdatePacket.WearableDataBlock();
289 awb.WearableType = (byte)i;
290 awb.AssetID = wearables[i].AssetID;
291 awb.ItemID = wearables[i].ItemID;
292 aw.WearableData[i] = awb;
293 }
294
295 this.OutPacket(aw);
296 }
297
298 /// <summary>
299 ///
300 /// </summary>
301 /// <param name="agentID"></param>
302 /// <param name="visualParams"></param>
303 /// <param name="textureEntry"></param>
304 public void SendAppearance(LLUUID agentID, byte[] visualParams, byte[] textureEntry)
305 {
306 AvatarAppearancePacket avp = new AvatarAppearancePacket();
307 avp.VisualParam = new AvatarAppearancePacket.VisualParamBlock[218];
308 avp.ObjectData.TextureEntry = textureEntry;
309
310 AvatarAppearancePacket.VisualParamBlock avblock = null;
311 for (int i = 0; i < visualParams.Length; i++)
312 {
313 avblock = new AvatarAppearancePacket.VisualParamBlock();
314 avblock.ParamValue = visualParams[i];
315 avp.VisualParam[i] = avblock;
316 }
317
318 avp.Sender.IsTrial = false;
319 avp.Sender.ID = agentID;
320 OutPacket(avp);
321 }
322
323 #endregion
290 324
325 #region Avatar Packet/data sending Methods
291 326
292 /// <summary> 327 /// <summary>
293 /// 328 ///
@@ -316,11 +351,12 @@ namespace OpenSim
316 libsecondlife.LLVector3 pos2 = new LLVector3((float)Pos.X, (float)Pos.Y, (float)Pos.Z); 351 libsecondlife.LLVector3 pos2 = new LLVector3((float)Pos.X, (float)Pos.Y, (float)Pos.Z);
317 byte[] pb = pos2.GetBytes(); 352 byte[] pb = pos2.GetBytes();
318 Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 16, pb.Length); 353 Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 16, pb.Length);
319 354
320 OutPacket(objupdate); 355 OutPacket(objupdate);
321 356
322 } 357 }
323 358
359
324 /// <summary> 360 /// <summary>
325 /// 361 ///
326 /// </summary> 362 /// </summary>
@@ -384,34 +420,7 @@ namespace OpenSim
384 return objdata; 420 return objdata;
385 } 421 }
386 422
387 public void InformClientOfNeighbour(ulong neighbourHandle, System.Net.IPAddress neighbourIP, ushort neighbourPort) 423 #endregion
388 {
389 EnableSimulatorPacket enablesimpacket = new EnableSimulatorPacket();
390 enablesimpacket.SimulatorInfo = new EnableSimulatorPacket.SimulatorInfoBlock();
391 enablesimpacket.SimulatorInfo.Handle = neighbourHandle;
392
393 byte[] byteIP = neighbourIP.GetAddressBytes();
394 enablesimpacket.SimulatorInfo.IP = (uint)byteIP[3] << 24;
395 enablesimpacket.SimulatorInfo.IP += (uint)byteIP[2] << 16;
396 enablesimpacket.SimulatorInfo.IP += (uint)byteIP[1] << 8;
397 enablesimpacket.SimulatorInfo.IP += (uint)byteIP[0];
398 enablesimpacket.SimulatorInfo.Port = neighbourPort;
399 OutPacket(enablesimpacket);
400 }
401
402 public AgentCircuitData RequestClientInfo()
403 {
404 AgentCircuitData agentData = new AgentCircuitData();
405 agentData.AgentID = this.AgentId;
406 agentData.SessionID = this.SessionID;
407 agentData.SecureSessionID = this.SecureSessionID;
408 agentData.circuitcode = this.CircuitCode;
409 agentData.child = false;
410 agentData.firstname = this.firstName;
411 agentData.lastname = this.lastName;
412
413 return agentData;
414 }
415 424
416 #region Primitive Packet/data Sending Methods 425 #region Primitive Packet/data Sending Methods
417 426
@@ -508,6 +517,88 @@ namespace OpenSim
508 objectData.PathTwist = primData.PathTwist; 517 objectData.PathTwist = primData.PathTwist;
509 objectData.PathTwistBegin = primData.PathTwistBegin; 518 objectData.PathTwistBegin = primData.PathTwistBegin;
510 } 519 }
520
521 public void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position, LLQuaternion rotation)
522 {
523 ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
524 terse.RegionData.RegionHandle = regionHandle;
525 terse.RegionData.TimeDilation = timeDilation;
526 terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
527 terse.ObjectData[0] = this.CreatePrimImprovedBlock(localID, position, rotation);
528
529 this.OutPacket(terse);
530 }
531
532 /// <summary>
533 ///
534 /// </summary>
535 /// <param name="localID"></param>
536 /// <param name="position"></param>
537 /// <param name="rotation"></param>
538 /// <returns></returns>
539 protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreatePrimImprovedBlock(uint localID, LLVector3 position, LLQuaternion rotation)
540 {
541 uint ID = localID;
542 byte[] bytes = new byte[60];
543
544 int i = 0;
545 ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock();
546 dat.TextureEntry = new byte[0];
547 bytes[i++] = (byte)(ID % 256);
548 bytes[i++] = (byte)((ID >> 8) % 256);
549 bytes[i++] = (byte)((ID >> 16) % 256);
550 bytes[i++] = (byte)((ID >> 24) % 256);
551 bytes[i++] = 0;
552 bytes[i++] = 0;
553
554 byte[] pb = position.GetBytes();
555 Array.Copy(pb, 0, bytes, i, pb.Length);
556 i += 12;
557 ushort ac = 32767;
558
559 //vel
560 bytes[i++] = (byte)(ac % 256);
561 bytes[i++] = (byte)((ac >> 8) % 256);
562 bytes[i++] = (byte)(ac % 256);
563 bytes[i++] = (byte)((ac >> 8) % 256);
564 bytes[i++] = (byte)(ac % 256);
565 bytes[i++] = (byte)((ac >> 8) % 256);
566
567 //accel
568 bytes[i++] = (byte)(ac % 256);
569 bytes[i++] = (byte)((ac >> 8) % 256);
570 bytes[i++] = (byte)(ac % 256);
571 bytes[i++] = (byte)((ac >> 8) % 256);
572 bytes[i++] = (byte)(ac % 256);
573 bytes[i++] = (byte)((ac >> 8) % 256);
574
575 ushort rw, rx, ry, rz;
576 rw = (ushort)(32768 * (rotation.W + 1));
577 rx = (ushort)(32768 * (rotation.X + 1));
578 ry = (ushort)(32768 * (rotation.Y + 1));
579 rz = (ushort)(32768 * (rotation.Z + 1));
580
581 //rot
582 bytes[i++] = (byte)(rx % 256);
583 bytes[i++] = (byte)((rx >> 8) % 256);
584 bytes[i++] = (byte)(ry % 256);
585 bytes[i++] = (byte)((ry >> 8) % 256);
586 bytes[i++] = (byte)(rz % 256);
587 bytes[i++] = (byte)((rz >> 8) % 256);
588 bytes[i++] = (byte)(rw % 256);
589 bytes[i++] = (byte)((rw >> 8) % 256);
590
591 //rotation vel
592 bytes[i++] = (byte)(ac % 256);
593 bytes[i++] = (byte)((ac >> 8) % 256);
594 bytes[i++] = (byte)(ac % 256);
595 bytes[i++] = (byte)((ac >> 8) % 256);
596 bytes[i++] = (byte)(ac % 256);
597 bytes[i++] = (byte)((ac >> 8) % 256);
598
599 dat.Data = bytes;
600 return dat;
601 }
511 #endregion 602 #endregion
512 603
513 #endregion 604 #endregion