aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Tools/pCampBot/Bot.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Tools/pCampBot/Bot.cs348
1 files changed, 274 insertions, 74 deletions
diff --git a/OpenSim/Tools/pCampBot/Bot.cs b/OpenSim/Tools/pCampBot/Bot.cs
index daaa3c0..4f28733 100644
--- a/OpenSim/Tools/pCampBot/Bot.cs
+++ b/OpenSim/Tools/pCampBot/Bot.cs
@@ -35,11 +35,13 @@ using System.Timers;
35using log4net; 35using log4net;
36using OpenMetaverse; 36using OpenMetaverse;
37using OpenMetaverse.Assets; 37using OpenMetaverse.Assets;
38using OpenMetaverse.Packets;
38using Nini.Config; 39using Nini.Config;
39using OpenSim.Framework; 40using OpenSim.Framework;
40using OpenSim.Framework.Console; 41using OpenSim.Framework.Console;
41using pCampBot.Interfaces; 42using pCampBot.Interfaces;
42using Timer = System.Timers.Timer; 43using Timer = System.Timers.Timer;
44using PermissionMask = OpenSim.Framework.PermissionMask;
43 45
44namespace pCampBot 46namespace pCampBot
45{ 47{
@@ -55,25 +57,47 @@ namespace pCampBot
55 { 57 {
56 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 58 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
57 59
60 public int PacketDebugLevel
61 {
62 get { return m_packetDebugLevel; }
63 set
64 {
65 if (value == m_packetDebugLevel)
66 return;
67
68 m_packetDebugLevel = value;
69
70 if (Client != null)
71 {
72 if (m_packetDebugLevel <= 0)
73 Client.Network.UnregisterCallback(PacketType.Default, PacketReceivedDebugHandler);
74 else
75 Client.Network.RegisterCallback(PacketType.Default, PacketReceivedDebugHandler, false);
76 }
77 }
78 }
79 private int m_packetDebugLevel;
80
58 public delegate void AnEvent(Bot callbot, EventType someevent); // event delegate for bot events 81 public delegate void AnEvent(Bot callbot, EventType someevent); // event delegate for bot events
59 82
60 /// <summary> 83 /// <summary>
61 /// Bot manager. 84 /// Controls whether bots request textures for the object information they receive
62 /// </summary> 85 /// </summary>
63 public BotManager Manager { get; private set; } 86 public bool RequestObjectTextures { get; set; }
64 87
65 /// <summary> 88 /// <summary>
66 /// Bot config, passed from BotManager. 89 /// Bot manager.
67 /// </summary> 90 /// </summary>
68 private IConfig startupConfig; 91 public BotManager Manager { get; private set; }
69 92
70 /// <summary> 93 /// <summary>
71 /// Behaviours implemented by this bot. 94 /// Behaviours implemented by this bot.
72 /// </summary> 95 /// </summary>
73 /// <remarks> 96 /// <remarks>
74 /// Lock this list before manipulating it. 97 /// Indexed by abbreviated name. There can only be one instance of a particular behaviour.
98 /// Lock this structure before manipulating it.
75 /// </remarks> 99 /// </remarks>
76 public List<IBehaviour> Behaviours { get; private set; } 100 public Dictionary<string, IBehaviour> Behaviours { get; private set; }
77 101
78 /// <summary> 102 /// <summary>
79 /// Objects that the bot has discovered. 103 /// Objects that the bot has discovered.
@@ -96,11 +120,35 @@ namespace pCampBot
96 /// </summary> 120 /// </summary>
97 public ConnectionState ConnectionState { get; private set; } 121 public ConnectionState ConnectionState { get; private set; }
98 122
123 public List<Simulator> Simulators
124 {
125 get
126 {
127 lock (Client.Network.Simulators)
128 return new List<Simulator>(Client.Network.Simulators);
129 }
130 }
131
132 /// <summary>
133 /// The number of connections that this bot has to different simulators.
134 /// </summary>
135 /// <value>Includes both root and child connections.</value>
136 public int SimulatorsCount
137 {
138 get
139 {
140 lock (Client.Network.Simulators)
141 return Client.Network.Simulators.Count;
142 }
143 }
144
99 public string FirstName { get; private set; } 145 public string FirstName { get; private set; }
100 public string LastName { get; private set; } 146 public string LastName { get; private set; }
101 public string Name { get; private set; } 147 public string Name { get; private set; }
102 public string Password { get; private set; } 148 public string Password { get; private set; }
103 public string LoginUri { get; private set; } 149 public string LoginUri { get; private set; }
150 public string StartLocation { get; private set; }
151
104 public string saveDir; 152 public string saveDir;
105 public string wear; 153 public string wear;
106 154
@@ -136,94 +184,180 @@ namespace pCampBot
136 /// <param name="behaviours"></param> 184 /// <param name="behaviours"></param>
137 public Bot( 185 public Bot(
138 BotManager bm, List<IBehaviour> behaviours, 186 BotManager bm, List<IBehaviour> behaviours,
139 string firstName, string lastName, string password, string loginUri) 187 string firstName, string lastName, string password, string startLocation, string loginUri)
140 { 188 {
141 ConnectionState = ConnectionState.Disconnected; 189 ConnectionState = ConnectionState.Disconnected;
142 190
143 behaviours.ForEach(b => b.Initialize(this)); 191 Random = new Random(bm.Rng.Next());
144
145 Client = new GridClient();
146
147 Random = new Random(Environment.TickCount);// We do stuff randomly here
148 FirstName = firstName; 192 FirstName = firstName;
149 LastName = lastName; 193 LastName = lastName;
150 Name = string.Format("{0} {1}", FirstName, LastName); 194 Name = string.Format("{0} {1}", FirstName, LastName);
151 Password = password; 195 Password = password;
152 LoginUri = loginUri; 196 LoginUri = loginUri;
197 StartLocation = startLocation;
153 198
154 Manager = bm; 199 Manager = bm;
155 startupConfig = bm.Config;
156 readconfig();
157 200
158 Behaviours = behaviours; 201 Behaviours = new Dictionary<string, IBehaviour>();
202 foreach (IBehaviour behaviour in behaviours)
203 AddBehaviour(behaviour);
204
205 // Only calling for use as a template.
206 CreateLibOmvClient();
207 }
208
209 public bool TryGetBehaviour(string abbreviatedName, out IBehaviour behaviour)
210 {
211 lock (Behaviours)
212 return Behaviours.TryGetValue(abbreviatedName, out behaviour);
213 }
214
215 public bool AddBehaviour(IBehaviour behaviour)
216 {
217 Dictionary<string, IBehaviour> updatedBehaviours = new Dictionary<string, IBehaviour>(Behaviours);
218
219 if (!updatedBehaviours.ContainsKey(behaviour.AbbreviatedName))
220 {
221 behaviour.Initialize(this);
222 updatedBehaviours.Add(behaviour.AbbreviatedName, behaviour);
223 Behaviours = updatedBehaviours;
224
225 return true;
226 }
227
228 return false;
229 }
230
231 public bool RemoveBehaviour(string abbreviatedName)
232 {
233 if (Behaviours.Count <= 0)
234 return false;
235
236 Dictionary<string, IBehaviour> updatedBehaviours = new Dictionary<string, IBehaviour>(Behaviours);
237 IBehaviour behaviour;
238
239 if (!updatedBehaviours.TryGetValue(abbreviatedName, out behaviour))
240 return false;
241
242 updatedBehaviours.Remove(abbreviatedName);
243 Behaviours = updatedBehaviours;
244
245 behaviour.Close();
246
247 return true;
248 }
249
250 private void CreateLibOmvClient()
251 {
252 GridClient newClient = new GridClient();
253
254 if (Client != null)
255 {
256 // Remove any registered debug handlers
257 Client.Network.UnregisterCallback(PacketType.Default, PacketReceivedDebugHandler);
258
259 newClient.Settings.LOGIN_SERVER = Client.Settings.LOGIN_SERVER;
260 newClient.Settings.ALWAYS_DECODE_OBJECTS = Client.Settings.ALWAYS_DECODE_OBJECTS;
261 newClient.Settings.AVATAR_TRACKING = Client.Settings.AVATAR_TRACKING;
262 newClient.Settings.OBJECT_TRACKING = Client.Settings.OBJECT_TRACKING;
263 newClient.Settings.SEND_AGENT_THROTTLE = Client.Settings.SEND_AGENT_THROTTLE;
264 newClient.Settings.SEND_AGENT_UPDATES = Client.Settings.SEND_AGENT_UPDATES;
265 newClient.Settings.SEND_PINGS = Client.Settings.SEND_PINGS;
266 newClient.Settings.STORE_LAND_PATCHES = Client.Settings.STORE_LAND_PATCHES;
267 newClient.Settings.USE_ASSET_CACHE = Client.Settings.USE_ASSET_CACHE;
268 newClient.Settings.MULTIPLE_SIMS = Client.Settings.MULTIPLE_SIMS;
269 newClient.Throttle.Asset = Client.Throttle.Asset;
270 newClient.Throttle.Land = Client.Throttle.Land;
271 newClient.Throttle.Task = Client.Throttle.Task;
272 newClient.Throttle.Texture = Client.Throttle.Texture;
273 newClient.Throttle.Wind = Client.Throttle.Wind;
274 newClient.Throttle.Total = Client.Throttle.Total;
275 }
276 else
277 {
278 newClient.Settings.LOGIN_SERVER = LoginUri;
279 newClient.Settings.ALWAYS_DECODE_OBJECTS = false;
280 newClient.Settings.AVATAR_TRACKING = false;
281 newClient.Settings.OBJECT_TRACKING = false;
282 newClient.Settings.SEND_AGENT_THROTTLE = true;
283 newClient.Settings.SEND_PINGS = true;
284 newClient.Settings.STORE_LAND_PATCHES = false;
285 newClient.Settings.USE_ASSET_CACHE = false;
286 newClient.Settings.MULTIPLE_SIMS = true;
287 newClient.Throttle.Asset = 100000;
288 newClient.Throttle.Land = 100000;
289 newClient.Throttle.Task = 100000;
290 newClient.Throttle.Texture = 100000;
291 newClient.Throttle.Wind = 100000;
292 newClient.Throttle.Total = 400000;
293 }
294
295 newClient.Network.LoginProgress += Network_LoginProgress;
296 newClient.Network.SimConnected += Network_SimConnected;
297 newClient.Network.SimDisconnected += Network_SimDisconnected;
298 newClient.Network.Disconnected += Network_OnDisconnected;
299 newClient.Objects.ObjectUpdate += Objects_NewPrim;
300
301 if (m_packetDebugLevel > 0)
302 newClient.Network.RegisterCallback(PacketType.Default, PacketReceivedDebugHandler);
303
304 Client = newClient;
159 } 305 }
160 306
161 //We do our actions here. This is where one would 307 //We do our actions here. This is where one would
162 //add additional steps and/or things the bot should do 308 //add additional steps and/or things the bot should do
163 private void Action() 309 private void Action()
164 { 310 {
165 while (true) 311 while (ConnectionState == ConnectionState.Connected)
166 lock (Behaviours) 312 {
167 Behaviours.ForEach( 313 foreach (IBehaviour behaviour in Behaviours.Values)
168 b => 314 {
169 { 315// Thread.Sleep(Random.Next(3000, 10000));
170 Thread.Sleep(Random.Next(3000, 10000)); 316
171 317 // m_log.DebugFormat("[pCAMPBOT]: For {0} performing action {1}", Name, b.GetType());
172 // m_log.DebugFormat("[pCAMPBOT]: For {0} performing action {1}", Name, b.GetType()); 318 behaviour.Action();
173 b.Action(); 319 }
174 } 320 }
175 );
176 }
177 321
178 /// <summary> 322 foreach (IBehaviour b in Behaviours.Values)
179 /// Read the Nini config and initialize 323 b.Close();
180 /// </summary>
181 public void readconfig()
182 {
183 wear = startupConfig.GetString("wear", "no");
184 } 324 }
185 325
186 /// <summary> 326 /// <summary>
187 /// Tells LibSecondLife to logout and disconnect. Raises the disconnect events once it finishes. 327 /// Tells LibSecondLife to logout and disconnect. Raises the disconnect events once it finishes.
188 /// </summary> 328 /// </summary>
189 public void shutdown() 329 public void Disconnect()
190 { 330 {
191 ConnectionState = ConnectionState.Disconnecting; 331 ConnectionState = ConnectionState.Disconnecting;
192 332
193 if (m_actionThread != null) 333 foreach (IBehaviour behaviour in Behaviours.Values)
194 m_actionThread.Abort(); 334 behaviour.Close();
195 335
196 Client.Network.Logout(); 336 Client.Network.Logout();
197 } 337 }
198 338
339 public void Connect()
340 {
341 Thread connectThread = new Thread(ConnectInternal);
342 connectThread.Name = Name;
343 connectThread.IsBackground = true;
344
345 connectThread.Start();
346 }
347
199 /// <summary> 348 /// <summary>
200 /// This is the bot startup loop. 349 /// This is the bot startup loop.
201 /// </summary> 350 /// </summary>
202 public void startup() 351 private void ConnectInternal()
203 { 352 {
204 Client.Settings.LOGIN_SERVER = LoginUri;
205 Client.Settings.ALWAYS_DECODE_OBJECTS = false;
206 Client.Settings.AVATAR_TRACKING = false;
207 Client.Settings.OBJECT_TRACKING = false;
208 Client.Settings.SEND_AGENT_THROTTLE = true;
209 Client.Settings.SEND_PINGS = true;
210 Client.Settings.STORE_LAND_PATCHES = false;
211 Client.Settings.USE_ASSET_CACHE = false;
212 Client.Settings.MULTIPLE_SIMS = true;
213 Client.Throttle.Asset = 100000;
214 Client.Throttle.Land = 100000;
215 Client.Throttle.Task = 100000;
216 Client.Throttle.Texture = 100000;
217 Client.Throttle.Wind = 100000;
218 Client.Throttle.Total = 400000;
219 Client.Network.LoginProgress += this.Network_LoginProgress;
220 Client.Network.SimConnected += this.Network_SimConnected;
221 Client.Network.Disconnected += this.Network_OnDisconnected;
222 Client.Objects.ObjectUpdate += Objects_NewPrim;
223
224 ConnectionState = ConnectionState.Connecting; 353 ConnectionState = ConnectionState.Connecting;
225 354
226 if (Client.Network.Login(FirstName, LastName, Password, "pCampBot", "Your name")) 355 // Current create a new client on each connect. libomv doesn't seem to process new sim
356 // information (e.g. EstablishAgentCommunication events) if connecting after a disceonnect with the same
357 // client
358 CreateLibOmvClient();
359
360 if (Client.Network.Login(FirstName, LastName, Password, "pCampBot", StartLocation, "pCampBot"))
227 { 361 {
228 ConnectionState = ConnectionState.Connected; 362 ConnectionState = ConnectionState.Connected;
229 363
@@ -234,7 +368,6 @@ namespace pCampBot
234// OnConnected(this, EventType.CONNECTED); 368// OnConnected(this, EventType.CONNECTED);
235 if (wear == "save") 369 if (wear == "save")
236 { 370 {
237 Client.Appearance.SetPreviousAppearance();
238 SaveDefaultAppearance(); 371 SaveDefaultAppearance();
239 } 372 }
240 else if (wear != "no") 373 else if (wear != "no")
@@ -267,6 +400,30 @@ namespace pCampBot
267 } 400 }
268 } 401 }
269 402
403 /// <summary>
404 /// Sit this bot on the ground.
405 /// </summary>
406 public void SitOnGround()
407 {
408 if (ConnectionState == ConnectionState.Connected)
409 Client.Self.SitOnGround();
410 }
411
412 /// <summary>
413 /// Stand this bot
414 /// </summary>
415 public void Stand()
416 {
417 if (ConnectionState == ConnectionState.Connected)
418 {
419 // Unlike sit on ground, here libomv checks whether we have SEND_AGENT_UPDATES enabled.
420 bool prevUpdatesSetting = Client.Settings.SEND_AGENT_UPDATES;
421 Client.Settings.SEND_AGENT_UPDATES = true;
422 Client.Self.Stand();
423 Client.Settings.SEND_AGENT_UPDATES = prevUpdatesSetting;
424 }
425 }
426
270 public void SaveDefaultAppearance() 427 public void SaveDefaultAppearance()
271 { 428 {
272 saveDir = "MyAppearance/" + FirstName + "_" + LastName; 429 saveDir = "MyAppearance/" + FirstName + "_" + LastName;
@@ -362,7 +519,7 @@ namespace pCampBot
362 asset.Encode(); 519 asset.Encode();
363 transid = Client.Assets.RequestUpload(asset,true); 520 transid = Client.Assets.RequestUpload(asset,true);
364 Client.Inventory.RequestCreateItem(clothfolder.UUID, "MyClothing" + i.ToString(), "MyClothing", AssetType.Clothing, 521 Client.Inventory.RequestCreateItem(clothfolder.UUID, "MyClothing" + i.ToString(), "MyClothing", AssetType.Clothing,
365 transid, InventoryType.Wearable, asset.WearableType, PermissionMask.All, delegate(bool success, InventoryItem item) 522 transid, InventoryType.Wearable, asset.WearableType, (OpenMetaverse.PermissionMask)PermissionMask.All, delegate(bool success, InventoryItem item)
366 { 523 {
367 if (success) 524 if (success)
368 { 525 {
@@ -386,7 +543,7 @@ namespace pCampBot
386 asset.Encode(); 543 asset.Encode();
387 transid = Client.Assets.RequestUpload(asset,true); 544 transid = Client.Assets.RequestUpload(asset,true);
388 Client.Inventory.RequestCreateItem(clothfolder.UUID, "MyBodyPart" + i.ToString(), "MyBodyPart", AssetType.Bodypart, 545 Client.Inventory.RequestCreateItem(clothfolder.UUID, "MyBodyPart" + i.ToString(), "MyBodyPart", AssetType.Bodypart,
389 transid, InventoryType.Wearable, asset.WearableType, PermissionMask.All, delegate(bool success, InventoryItem item) 546 transid, InventoryType.Wearable, asset.WearableType, (OpenMetaverse.PermissionMask)PermissionMask.All, delegate(bool success, InventoryItem item)
390 { 547 {
391 if (success) 548 if (success)
392 { 549 {
@@ -450,7 +607,13 @@ namespace pCampBot
450 public void Network_SimConnected(object sender, SimConnectedEventArgs args) 607 public void Network_SimConnected(object sender, SimConnectedEventArgs args)
451 { 608 {
452 m_log.DebugFormat( 609 m_log.DebugFormat(
453 "[BOT]: Bot {0} connected to {1} at {2}", Name, args.Simulator.Name, args.Simulator.IPEndPoint); 610 "[BOT]: Bot {0} connected to region {1} at {2}", Name, args.Simulator.Name, args.Simulator.IPEndPoint);
611 }
612
613 public void Network_SimDisconnected(object sender, SimDisconnectedEventArgs args)
614 {
615 m_log.DebugFormat(
616 "[BOT]: Bot {0} disconnected from region {1} at {2}", Name, args.Simulator.Name, args.Simulator.IPEndPoint);
454 } 617 }
455 618
456 public void Network_OnDisconnected(object sender, DisconnectedEventArgs args) 619 public void Network_OnDisconnected(object sender, DisconnectedEventArgs args)
@@ -458,7 +621,7 @@ namespace pCampBot
458 ConnectionState = ConnectionState.Disconnected; 621 ConnectionState = ConnectionState.Disconnected;
459 622
460 m_log.DebugFormat( 623 m_log.DebugFormat(
461 "[BOT]: Bot {0} disconnected reason {1}, message {2}", Name, args.Reason, args.Message); 624 "[BOT]: Bot {0} disconnected from grid, reason {1}, message {2}", Name, args.Reason, args.Message);
462 625
463// m_log.ErrorFormat("Fired Network_OnDisconnected"); 626// m_log.ErrorFormat("Fired Network_OnDisconnected");
464 627
@@ -467,6 +630,8 @@ namespace pCampBot
467// || args.Reason == NetworkManager.DisconnectType.NetworkTimeout) 630// || args.Reason == NetworkManager.DisconnectType.NetworkTimeout)
468// && OnDisconnected != null) 631// && OnDisconnected != null)
469 632
633
634
470 if ( 635 if (
471 (args.Reason == NetworkManager.DisconnectType.ClientInitiated 636 (args.Reason == NetworkManager.DisconnectType.ClientInitiated
472 || args.Reason == NetworkManager.DisconnectType.ServerInitiated 637 || args.Reason == NetworkManager.DisconnectType.ServerInitiated
@@ -480,8 +645,8 @@ namespace pCampBot
480 645
481 public void Objects_NewPrim(object sender, PrimEventArgs args) 646 public void Objects_NewPrim(object sender, PrimEventArgs args)
482 { 647 {
483// if (Name.EndsWith("4")) 648 if (!RequestObjectTextures)
484// throw new Exception("Aaargh"); 649 return;
485 650
486 Primitive prim = args.Prim; 651 Primitive prim = args.Prim;
487 652
@@ -494,7 +659,7 @@ namespace pCampBot
494 { 659 {
495 if (prim.Textures.DefaultTexture.TextureID != UUID.Zero) 660 if (prim.Textures.DefaultTexture.TextureID != UUID.Zero)
496 { 661 {
497 GetTexture(prim.Textures.DefaultTexture.TextureID); 662 GetTextureOrMesh(prim.Textures.DefaultTexture.TextureID, true);
498 } 663 }
499 664
500 for (int i = 0; i < prim.Textures.FaceTextures.Length; i++) 665 for (int i = 0; i < prim.Textures.FaceTextures.Length; i++)
@@ -506,32 +671,56 @@ namespace pCampBot
506 UUID textureID = prim.Textures.FaceTextures[i].TextureID; 671 UUID textureID = prim.Textures.FaceTextures[i].TextureID;
507 672
508 if (textureID != UUID.Zero) 673 if (textureID != UUID.Zero)
509 GetTexture(textureID); 674 GetTextureOrMesh(textureID, true);
510 } 675 }
511 } 676 }
512 } 677 }
513 678
514 if (prim.Sculpt != null && prim.Sculpt.SculptTexture != UUID.Zero) 679 if (prim.Sculpt != null && prim.Sculpt.SculptTexture != UUID.Zero)
515 GetTexture(prim.Sculpt.SculptTexture); 680 {
681 bool mesh = (prim.Sculpt.Type == SculptType.Mesh);
682 GetTextureOrMesh(prim.Sculpt.SculptTexture, !mesh);
683 }
516 } 684 }
517 } 685 }
518 686
519 private void GetTexture(UUID textureID) 687 private void GetTextureOrMesh(UUID assetID, bool texture)
520 { 688 {
521 lock (Manager.AssetsReceived) 689 lock (Manager.AssetsReceived)
522 { 690 {
523 // Don't request assets more than once. 691 // Don't request assets more than once.
524 if (Manager.AssetsReceived.ContainsKey(textureID)) 692 if (Manager.AssetsReceived.ContainsKey(assetID))
525 return; 693 return;
526 694
527 Manager.AssetsReceived[textureID] = false; 695 Manager.AssetsReceived[assetID] = false;
528 Client.Assets.RequestImage(textureID, ImageType.Normal, Asset_TextureCallback_Texture); 696 }
697
698 try
699 {
700 if (texture)
701 Client.Assets.RequestImage(assetID, ImageType.Normal, Asset_TextureCallback_Texture);
702 else
703 Client.Assets.RequestMesh(assetID, Asset_MeshCallback);
704 }
705 catch (Exception e)
706 {
707 m_log.Warn(string.Format("Error requesting {0} {1}", texture ? "texture" : "mesh", assetID), e);
529 } 708 }
530 } 709 }
531 710
532 public void Asset_TextureCallback_Texture(TextureRequestState state, AssetTexture assetTexture) 711 public void Asset_TextureCallback_Texture(TextureRequestState state, AssetTexture assetTexture)
533 { 712 {
534 //TODO: Implement texture saving and applying 713 if (state == TextureRequestState.Finished)
714 {
715 lock (Manager.AssetsReceived)
716 Manager.AssetsReceived[assetTexture.AssetID] = true;
717 }
718 }
719
720 private void Asset_MeshCallback(bool success, AssetMesh assetMesh)
721 {
722 lock (Manager.AssetsReceived)
723 Manager.AssetsReceived[assetMesh.AssetID] = success;
535 } 724 }
536 725
537 public void Asset_ReceivedCallback(AssetDownload transfer, Asset asset) 726 public void Asset_ReceivedCallback(AssetDownload transfer, Asset asset)
@@ -544,5 +733,16 @@ namespace pCampBot
544// SaveAsset((AssetWearable) asset); 733// SaveAsset((AssetWearable) asset);
545// } 734// }
546 } 735 }
736
737 private void PacketReceivedDebugHandler(object o, PacketReceivedEventArgs args)
738 {
739 Packet p = args.Packet;
740 Header h = p.Header;
741 Simulator s = args.Simulator;
742
743 m_log.DebugFormat(
744 "[BOT]: Bot {0} received from {1} packet {2} #{3}, rel {4}, res {5}",
745 Name, s.Name, p.Type, h.Sequence, h.Reliable, h.Resent);
746 }
547 } 747 }
548} 748}