Пример #1
0
 void Objects_ObjectDataBlockUpdate(object sender, ObjectDataBlockUpdateEventArgs e)
 {
     if (Prims.ContainsKey(e.Prim.LocalID))
     {
         UpdatePrimBlocking(e.Prim);
     }
 }
        private void Objects_OnObjectDataBlockUpdate(object sender, ObjectDataBlockUpdateEventArgs e)
        {
            Simulator simulator = e.Simulator;
            Primitive prim      = e.Prim;
            var       data      = e.ConstructionData;

            ObjectUpdatePacket.ObjectDataBlock block = e.Block;
            var objectupdate0 = e.Update;

            if (!IsMaster(simulator))
            {
                return;
            }
            // return;
            if (!objectupdate0.Avatar)
            {
                PrimtiveBlockUpdate(simulator, objectupdate0, prim, block, data);
            }
            else // this code only is usefull for avatars
            {
                prim.Flags = (PrimFlags)block.UpdateFlags;

                if ((prim.Flags & PrimFlags.ZlibCompressed) != 0)
                {
                    Logger.Log("Got a ZlibCompressed ObjectMovementUpdate, implement me!",
                               Helpers.LogLevel.Warning, client);
                }

                prim.NameValues = e.NameValues;
                prim.LocalID    = block.ID;
                prim.ID         = block.FullID;
                //NOTE this broke onSitChanged! prim.ParentID = block.ParentID;
                prim.RegionHandle = simulator.Handle;
                prim.Scale        = block.Scale;
                prim.ClickAction  = (ClickAction)block.ClickAction;
                prim.OwnerID      = block.OwnerID;
                prim.MediaURL     = Utils.BytesToString(block.MediaURL);
                prim.Text         = Utils.BytesToString(block.Text);
                prim.TextColor    = new Color4(block.TextColor, 0, false, true);

                // Sound information
                prim.Sound       = block.Sound;
                prim.SoundFlags  = (SoundFlags)block.Flags;
                prim.SoundGain   = block.Gain;
                prim.SoundRadius = block.Radius;

                // Joint information
                prim.Joint             = (JointType)block.JointType;
                prim.JointPivot        = block.JointPivot;
                prim.JointAxisOrAnchor = block.JointAxisOrAnchor;

                // Object parameters
                prim.PrimData = data;

                // Textures, texture animations, particle system, and extra params
                //prim.Textures = objectupdate.Textures;

                prim.TextureAnim = new Primitive.TextureAnimation(block.TextureAnim, 0);
                prim.ParticleSys = new Primitive.ParticleSystem(block.PSBlock, 0);
                prim.SetExtraParamsFromBytes(block.ExtraParams, 0);

                // PCode-specific data
                switch (data.PCode)
                {
                case PCode.Grass:
                case PCode.Tree:
                case PCode.NewTree:
                    if (block.Data.Length == 1)
                    {
                        prim.TreeSpecies = (Tree)block.Data[0];
                    }
                    else
                    {
                        Logger.Log("Got a foliage update with an invalid TreeSpecies field", Helpers.LogLevel.Warning);
                    }
                    prim.ScratchPad = Utils.EmptyBytes;
                    break;

                default:
                    prim.ScratchPad = new byte[block.Data.Length];
                    if (block.Data.Length > 0)
                    {
                        Buffer.BlockCopy(block.Data, 0, prim.ScratchPad, 0, prim.ScratchPad.Length);
                    }
                    break;
                }

                // Packed parameters
                //prim.CollisionPlane = objectupdate.CollisionPlane;
                //prim.Position = objectupdate.Position;
                //prim.Velocity = objectupdate.Velocity;
                //prim.Acceleration = objectupdate.Acceleration;
                //prim.Rotation = objectupdate.Rotation;
                //prim.AngularVelocity = objectupdate.AngularVelocity;
                EnsureSelected(prim, simulator);
                Objects_OnPrimitiveUpdateReal(simulator, prim, objectupdate0, simulator.Handle, 0);
            }
        }