Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 5th, 2012  |  syntax: None  |  size: 3.23 KB  |  hits: 8  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. using System;
  2. using System.Collections.ObjectModel;
  3. using System.Collections.Generic;
  4. using System.Collections;
  5. using System.Linq;
  6. using System.Text;
  7. using OpenMetaverse;
  8.  
  9. namespace LinkBot
  10. {
  11.     public class Linkset : InternalDict<uint, Primitive>
  12.     {
  13.         public uint LocalID
  14.         {
  15.             get { return this.First().Value.ParentID; }
  16.         }
  17.     }
  18.  
  19.     public class LinksetManager
  20.     {
  21.         private List<Linkset> _linksets;
  22.         private GridClient _client;
  23.         private bool _active = false;
  24.  
  25.         private bool _clientSettingsObjectTracking;
  26.  
  27.         public LinksetManager(GridClient client) :
  28.             this(client, true){}
  29.  
  30.         public LinksetManager(GridClient client, bool active)
  31.         {
  32.             _client = client;
  33.             Active = active;
  34.  
  35.             _linksets = new List<Linkset>();
  36.         }
  37.  
  38.         public ReadOnlyCollection<Linkset> Linksets
  39.         {
  40.             get { return(_linksets.AsReadOnly()); }
  41.         }
  42.  
  43.         public bool Active
  44.         {
  45.             get { return(_active); }
  46.             set
  47.             {
  48.                 if (value)
  49.                 {
  50.                     _clientSettingsObjectTracking = _client.Settings.OBJECT_TRACKING;
  51.                     _client.Settings.OBJECT_TRACKING = true;
  52.  
  53.                     InitCallbacks(true);
  54.                 }
  55.                 else
  56.                 {
  57.                     _client.Settings.OBJECT_TRACKING = _clientSettingsObjectTracking;
  58.  
  59.                     InitCallbacks(false);
  60.                 }
  61.             }
  62.         }
  63.  
  64.         protected void InitCallbacks(bool handle)
  65.         {
  66.             if (handle)
  67.             {
  68.                 _client.Objects.ObjectUpdate += new EventHandler<PrimEventArgs>(Objects_ObjectUpdate);
  69.                 _client.Objects.KillObject += new EventHandler<KillObjectEventArgs>(Objects_KillObject);
  70.             }
  71.             else
  72.             {
  73.                 _client.Objects.ObjectUpdate -= Objects_ObjectUpdate;
  74.                 _client.Objects.KillObject -= Objects_KillObject;
  75.             }
  76.         }
  77.  
  78.         void Objects_KillObject(object sender, KillObjectEventArgs e)
  79.         {
  80.             lock (_linksets)
  81.             {
  82.                 foreach (Linkset linkset in _linksets)
  83.                 {
  84.                     if (linkset.LocalID == e.ObjectLocalID)
  85.                         _linksets.Remove(linkset);
  86.                 }
  87.             }
  88.         }
  89.  
  90.         void Objects_ObjectUpdate(object sender, PrimEventArgs e)
  91.         {
  92.             lock (_linksets)
  93.             {
  94.                 bool found = false;
  95.                 foreach (Linkset linkset in _linksets)
  96.                 {
  97.                     if (linkset.ContainsKey(e.Prim.LocalID))
  98.                     {
  99.                         found = true;
  100.                         break;
  101.                     }
  102.                     else if (linkset.LocalID == e.Prim.ParentID)
  103.                     {
  104.                         found = true;
  105.                         linkset.Add(e.Prim.LocalID, e.Prim);
  106.                         break;
  107.                     }
  108.                 }
  109.  
  110.                 if (!found)
  111.                 {
  112.                     Linkset linkset = new Linkset();
  113.                     linkset.Add(e.Prim.LocalID, e.Prim);
  114.                     _linksets.Add(linkset);
  115.                 }
  116.             }
  117.         }
  118.     }
  119. }