Пример #1
0
        public void HandleObjectSpinUpdate(Message m)
        {
            var req = (ObjectSpinUpdate)m;

            if (req.CircuitSessionID != req.SessionID ||
                req.CircuitAgentID != req.AgentID)
            {
                return;
            }

#if DEBUG
            m_Log.DebugFormat("ObjectSpinUpdate localid={0}", req.ObjectID);
#endif

            ObjectPart part;
            if (!Primitives.TryGetValue(req.ObjectID, out part))
            {
                return;
            }

            IAgent agent;
            if (!Agents.TryGetValue(req.AgentID, out agent))
            {
                return;
            }

            Object.ObjectGroup objgrp = part.ObjectGroup;
            if (objgrp != null && (part.Flags & PrimitiveFlags.Touch) == 0)
            {
                /* only allow when no touch event is active */
                GrabMovement(agent, objgrp, part, req.Rotation);
            }
        }
Пример #2
0
        public void HandleRequestPayPrice(Message m)
        {
            var req = (RequestPayPrice)m;

            IAgent agent;

            if (!Agents.TryGetValue(req.CircuitAgentID, out agent))
            {
                return;
            }

#if DEBUG
            m_Log.DebugFormat("PayPrice localid={0}", req.ObjectID);
#endif

            ObjectPart part;
            if (Primitives.TryGetValue(req.ObjectID, out part))
            {
                Object.ObjectGroup grp = part.ObjectGroup;
                var rep = new PayPriceReply
                {
                    ObjectID        = req.ObjectID,
                    DefaultPayPrice = grp.PayPrice0
                };
                rep.ButtonData.Add(grp.PayPrice1);
                rep.ButtonData.Add(grp.PayPrice2);
                rep.ButtonData.Add(grp.PayPrice3);
                rep.ButtonData.Add(grp.PayPrice4);

                agent.SendMessageAlways(rep, ID);
            }
        }
Пример #3
0
        private void GrabMovement(IAgent agent, Object.ObjectGroup grp, ObjectPart part, Quaternion newrot)
        {
            if (grp.IsAttached)
            {
                return;
            }
            else if (grp.IsBlockGrab && grp.RootPart == part)
            {
                return;
            }
            else if ((grp.RootPart.Flags & PrimitiveFlags.Touch) != 0 && part.PassTouchMode != PassEventMode.Never)
            {
                return;
            }
            else if (grp.IsBlockGrabObject)
            {
                return;
            }
            else if (!CanMove(agent, grp, grp.GlobalPosition))
            {
                return;
            }

            if (grp.IsPhysics)
            {
                /* TODO: implement logic for physical input */
            }
            else
            {
                grp.GlobalRotation = newrot;
            }
        }
Пример #4
0
        public void HandleObjectAttach(Message m)
        {
            var req = (ObjectAttach)m;

            if (req.CircuitSessionID != req.SessionID ||
                req.CircuitAgentID != req.AgentID)
            {
                return;
            }
            ObjectPart part;
            IAgent     agent;

            if (!RootAgents.TryGetValue(req.AgentID, out agent))
            {
                return;
            }
            foreach (ObjectAttach.Data d in req.ObjectData)
            {
                if (Primitives.TryGetValue(d.ObjectLocalID, out part))
                {
                    Object.ObjectGroup grp = part.ObjectGroup;
                    if (CanTake(agent, grp, grp.Position))
                    {
                        try
                        {
                            agent.AttachObject(grp, req.AttachmentPoint);
                            grp.Rotation = d.Rotation;
                        }
                        catch
                        {
                        }
                    }
                }
            }
        }
        public void HandleObjectGrabUpdate(Message m)
        {
            var req = (ObjectGrabUpdate)m;

            if (req.CircuitSessionID != req.SessionID ||
                req.CircuitAgentID != req.AgentID)
            {
                return;
            }

            var e = new TouchEvent
            {
                Detected = new List <DetectInfo>(),
                Type     = TouchEvent.TouchType.Continuous
            };
            ObjectPart part;

            if (!Primitives.TryGetValue(req.ObjectID, out part))
            {
                return;
            }

            IAgent agent;

            if (!Agents.TryGetValue(req.AgentID, out agent))
            {
                return;
            }

            Object.ObjectGroup objgrp = part.ObjectGroup;
            if (objgrp != null && (part.Flags & PrimitiveFlags.Touch) == 0)
            {
                /* only allow when no touch event is active */
                GrabMovement(agent, objgrp, part, req.GrabPosition);
            }

            var detectdata = new DetectInfo();

            AddDetectAgentData(agent, ref detectdata);
            detectdata.GrabOffset = req.GrabPosition;
            detectdata.LinkNumber = part.LinkNumber;
            if (req.ObjectData.Count > 0)
            {
                var grabdata = req.ObjectData[0];
                detectdata.TouchBinormal = grabdata.Binormal;
                detectdata.TouchNormal   = grabdata.Normal;
                detectdata.TouchFace     = grabdata.FaceIndex;
                detectdata.TouchPosition = grabdata.Position;
                detectdata.TouchST       = grabdata.STCoord;
                detectdata.TouchUV       = grabdata.UVCoord;
            }
            e.Detected.Add(detectdata);

            part.PostTouchEvent(e);
        }
Пример #6
0
 private bool IsObjectScripted(Object.ObjectGroup grp)
 {
     foreach (ObjectPart p in grp.Values)
     {
         if (p.IsScripted)
         {
             return(true);
         }
     }
     return(false);
 }
Пример #7
0
        public void HandleObjectFlagUpdate(Message m)
        {
            var req = (ObjectFlagUpdate)m;

            if (req.CircuitSessionID != req.SessionID ||
                req.CircuitAgentID != req.AgentID)
            {
                return;
            }

            IAgent agent;

            if (!Agents.TryGetValue(req.AgentID, out agent))
            {
                return;
            }

            ObjectPart part;

            if (!Primitives.TryGetValue(req.ObjectLocalID, out part))
            {
                return;
            }

            Object.ObjectGroup grp = part.ObjectGroup;
            if (grp == null)
            {
                return;
            }

#if DEBUG
            m_Log.DebugFormat("ObjectFlagUpdate localid={0} isphantom={1} istemporary={2} usephysics={3}", req.ObjectLocalID, req.IsPhantom, req.IsTemporary, req.UsePhysics);
#endif

            grp.IsPhantom   = req.IsPhantom;
            grp.IsTemporary = req.IsTemporary;
            grp.IsPhysics   = req.UsePhysics;
            if (req.ExtraPhysics.Count != 0)
            {
                ObjectFlagUpdate.ExtraPhysicsData d = req.ExtraPhysics[0];
                part.PhysicsShapeType         = d.PhysicsShapeType;
                part.PhysicsDensity           = d.Density;
                part.PhysicsFriction          = d.Friction;
                part.PhysicsRestitution       = d.Restitution;
                part.PhysicsGravityMultiplier = d.GravityMultiplier;
            }
        }
Пример #8
0
        public UInt32 ObjectAdd(ObjectAdd p)
        {
            var rezparams = new RezObjectParams();
            var group     = new Object.ObjectGroup();
            var part      = new ObjectPart();

            group.Add(1, part.ID, part);
            group.Name = "Primitive";
            IAgent agent      = Agents[p.AgentID];
            UGUI   agentOwner = agent.Owner;

            group.LastOwner        = agentOwner;
            part.Creator           = agentOwner;
            rezparams.RezzingAgent = agentOwner;
            ObjectPart.PrimitiveShape pshape = part.Shape;
            pshape.PCode            = p.PCode;
            part.Material           = p.Material;
            pshape.PathCurve        = p.PathCurve;
            pshape.ProfileCurve     = p.ProfileCurve;
            pshape.PathBegin        = p.PathBegin;
            pshape.PathEnd          = p.PathEnd;
            pshape.PathScaleX       = p.PathScaleX;
            pshape.PathScaleY       = p.PathScaleY;
            pshape.PathShearX       = p.PathShearX;
            pshape.PathShearY       = p.PathShearY;
            pshape.PathTwist        = p.PathTwist;
            pshape.PathTwistBegin   = p.PathTwistBegin;
            pshape.PathRadiusOffset = p.PathRadiusOffset;
            pshape.PathTaperX       = p.PathTaperX;
            pshape.PathTaperY       = p.PathTaperY;
            pshape.PathRevolutions  = p.PathRevolutions;
            pshape.PathSkew         = p.PathSkew;
            pshape.ProfileBegin     = p.ProfileBegin;
            pshape.ProfileEnd       = p.ProfileEnd;
            pshape.ProfileHollow    = p.ProfileHollow;

            rezparams.RayStart             = p.RayStart;
            rezparams.RayEnd               = p.RayEnd;
            rezparams.RayTargetID          = p.RayTargetID;
            rezparams.RayEndIsIntersection = p.RayEndIsIntersection;
            rezparams.Scale    = p.Scale;
            rezparams.Rotation = p.Rotation;
            pshape.State       = p.State;
            group.AttachPoint  = p.LastAttachPoint;

            part.Size          = Vector3.One / 2.0;
            part.BaseMask      = p.BasePermissions;
            part.EveryoneMask  = p.EveryOnePermissions;
            part.OwnerMask     = p.CurrentPermissions;
            part.NextOwnerMask = p.NextOwnerPermissions;
            part.GroupMask     = p.GroupPermissions;
            part.Shape         = pshape;
            group.Group.ID     = p.GroupID;
            part.ObjectGroup   = group;
            part.Size          = Vector3.One / 2f;

            /* initial setup of object */
            part.UpdateData(ObjectPartLocalizedInfo.UpdateDataFlags.All);

            var selectedList = agent.SelectedObjects(ID);

            foreach (UUID old in selectedList.GetAndClear())
            {
                ObjectPart oldSelectedPart;
                if (Primitives.TryGetValue(old, out oldSelectedPart))
                {
                    agent.ScheduleUpdate(oldSelectedPart.UpdateInfo, ID);
                }
            }
            selectedList.Add(part.ID);

            return(RezObject(group, rezparams));
        }
Пример #9
0
        public void HandleObjectBuyWorkItem(object o)
        {
            var    req = (ObjectBuy)o;
            IAgent agent;

            if (!Agents.TryGetValue(req.AgentID, out agent))
            {
                return;
            }

            foreach (ObjectBuy.Data data in req.ObjectData)
            {
                ObjectPart part;
                if (!Primitives.TryGetValue(data.ObjectLocalID, out part))
                {
                    agent.SendAlertMessage(this.GetLanguageString(agent.CurrentCulture, "UnableToBuyDueNotFoundObject", "Unable to buy. The object was not found."), ID);
                }
                else
                {
                    Object.ObjectGroup grp = part.ObjectGroup;
                    if (grp.SalePrice != data.SalePrice || grp.SaleType != data.SaleType)
                    {
                        agent.SendAlertMessage(this.GetLanguageString(agent.CurrentCulture, "BuyingCurrentlyNotPossibleDueInvalidRequest", "Buying currently not possible since the viewer request is invalid. You might have to relog."), ID);
                    }
                    else if (grp.SalePrice != 0 && agent.EconomyService == null)
                    {
                        agent.SendAlertMessage(this.GetLanguageString(agent.CurrentCulture, "BuyingForAnyOtherPriceThanZeroIsNotPossible", "Buying for any other price than zero is not possible without economy system."), ID);
                    }
                    else
                    {
                        var       assetids        = new List <UUID>();
                        var       items           = new List <InventoryItem>();
                        bool      foundNoTransfer = false;
                        AssetData newAsset;
                        switch (grp.SaleType)
                        {
                        case InventoryItem.SaleInfoData.SaleType.NoSale:
                        default:
                            continue;

                        case InventoryItem.SaleInfoData.SaleType.Original:
                        case InventoryItem.SaleInfoData.SaleType.Copy:
                            UUID assetID;
                            if (grp.Owner == agent.Owner)
                            {
                                assetID = grp.OriginalAssetID;
                                if (assetID == UUID.Zero)
                                {
                                    newAsset    = grp.Asset(XmlSerializationOptions.WriteXml2 | XmlSerializationOptions.WriteOwnerInfo);
                                    assetID     = UUID.Random;
                                    newAsset.ID = assetID;
                                    AssetService.Store(newAsset);
                                    assetID             = newAsset.ID;
                                    grp.OriginalAssetID = assetID;
                                }
                            }
                            else
                            {
                                assetID = grp.NextOwnerAssetID;
                                if (assetID == UUID.Zero)
                                {
                                    newAsset    = grp.Asset(UGUI.Unknown, XmlSerializationOptions.WriteXml2 | XmlSerializationOptions.AdjustForNextOwner);
                                    assetID     = UUID.Random;
                                    newAsset.ID = assetID;
                                    AssetService.Store(newAsset);
                                    assetID = newAsset.ID;
                                    grp.NextOwnerAssetID = assetID;
                                }
                            }
                            assetids.Add(assetID);

                            if (grp.SaleType == InventoryItem.SaleInfoData.SaleType.Original)
                            {
                                Remove(grp);
                            }

                            bool foundNoCopy = false;
                            foreach (ObjectPart checkpart in grp.Values)
                            {
                                if (!checkpart.CheckPermissions(checkpart.Owner, checkpart.Group, InventoryPermissionsMask.Transfer))
                                {
                                    agent.SendAlertMessage(this.GetLanguageString(agent.CurrentCulture, "UnableToSellNoTransferItem", "Unable to sell no transfer item."), ID);
                                    foundNoTransfer = true;
                                    break;
                                }
                                if (grp.SaleType == InventoryItem.SaleInfoData.SaleType.Copy &&
                                    !checkpart.CheckPermissions(checkpart.Owner, checkpart.Group, InventoryPermissionsMask.Copy))
                                {
                                    agent.SendAlertMessage(this.GetLanguageString(agent.CurrentCulture, "UnableToSellNoCopyItemAsACopy", "Unable to sell no copy item as a copy."), ID);
                                    foundNoCopy = true;
                                    break;
                                }
                                foreach (ObjectPartInventoryItem item in checkpart.Inventory.Values)
                                {
                                    if (item.CheckPermissions(item.Owner, item.Group, InventoryPermissionsMask.Transfer))
                                    {
                                        agent.SendAlertMessage(this.GetLanguageString(agent.CurrentCulture, "UnableToSellNoTransferItem", "Unable to sell no transfer item."), ID);
                                        foundNoTransfer = true;
                                        break;
                                    }
                                }
                            }
                            if (foundNoTransfer || foundNoCopy)
                            {
                                continue;
                            }
                            var objectItem = new InventoryItem
                            {
                                Name          = grp.Name,
                                Description   = grp.Description,
                                LastOwner     = grp.Owner,
                                Owner         = agent.Owner,
                                AssetID       = assetID,
                                AssetType     = AssetType.Object,
                                InventoryType = InventoryType.Object
                            };
                            objectItem.Permissions.Base      = grp.RootPart.BaseMask;
                            objectItem.Permissions.EveryOne  = grp.RootPart.EveryoneMask;
                            objectItem.Permissions.Group     = InventoryPermissionsMask.None;
                            objectItem.Permissions.NextOwner = grp.RootPart.NextOwnerMask;
                            objectItem.Permissions.Current   = objectItem.Permissions.Base;
                            if (!agent.Owner.EqualsGrid(grp.Owner))
                            {
                                objectItem.AdjustToNextOwner();
                            }
                            items.Add(objectItem);
                            break;

                        case InventoryItem.SaleInfoData.SaleType.Content:
                            foreach (ObjectPartInventoryItem item in part.Inventory.Values)
                            {
                                if (!item.CheckPermissions(item.Owner, item.Group, InventoryPermissionsMask.Transfer))
                                {
                                    agent.SendAlertMessage(this.GetLanguageString(agent.CurrentCulture, "UnableToSellNoTransferItem", "Unable to sell no transfer item."), ID);
                                    foundNoTransfer = true;
                                    break;
                                }
                            }

                            if (foundNoTransfer)
                            {
                                continue;
                            }

                            foreach (ObjectPartInventoryItem item in part.Inventory.Values)
                            {
                                assetID = item.NextOwnerAssetID;
                                if (assetID == UUID.Zero && !item.Owner.EqualsGrid(agent.Owner))
                                {
                                    /* create next owner asset id */
                                    item.NextOwnerAssetID = AssetService.GenerateNextOwnerAsset(assetID);
                                }
                                var newItem = new InventoryItem(item);
                                if (!item.Owner.EqualsGrid(agent.Owner))
                                {
                                    newItem.AssetID = item.NextOwnerAssetID;
                                    newItem.AdjustToNextOwner();
                                }
                                assetids.Add(newItem.AssetID);

                                items.Add(newItem);
                                if (!item.CheckPermissions(item.Owner, item.Group, InventoryPermissionsMask.Copy))
                                {
                                    part.Inventory.Remove(item.ID);
                                }
                            }
                            break;
                        }

                        if (grp.SalePrice == 0)
                        {
                            new ObjectBuyTransferItem(
                                agent,
                                this,
                                assetids,
                                items,
                                grp.SaleType == InventoryItem.SaleInfoData.SaleType.Content ? part.Name : string.Empty,
                                part.ID).QueueWorkItem();
                        }
                        else if (agent.EconomyService != null)
                        {
                            IActiveTransaction transaction;
                            try
                            {
                                transaction = agent.EconomyService.BeginTransferTransaction(agent.Owner, part.Owner,
                                                                                            grp.SaleType == InventoryItem.SaleInfoData.SaleType.Content ?
                                                                                            (BaseTransaction) new ObjectInventorySaleTransaction(
                                                                                                GridPosition,
                                                                                                ID,
                                                                                                Name)
                                {
                                    ObjectID   = grp.ID,
                                    ObjectName = grp.Name
                                } :
                                                                                            new ObjectSaleTransaction(
                                                                                                GridPosition,
                                                                                                ID,
                                                                                                Name)
                                {
                                    ObjectID   = grp.ID,
                                    ObjectName = grp.Name
                                },
                                                                                            grp.SalePrice);
                            }
                            catch (InsufficientFundsException)
                            {
                                agent.SendAlertMessage(this.GetLanguageString(agent.CurrentCulture, "UnableToBuyInsufficientFunds", "Unable to buy. Insufficient funds."), ID);
                                continue;
                            }
                            catch (Exception e)
                            {
                                m_Log.Error("Exception at object selling", e);
                                agent.SendAlertMessage(e.Message, ID);
                                continue;
                            }

                            new ObjectBuyTransferItem(
                                agent,
                                this,
                                assetids,
                                items,
                                grp.SaleType == InventoryItem.SaleInfoData.SaleType.Content ? part.Name : string.Empty,
                                part.ID,
                                transaction).QueueWorkItem();
                        }
                        else
                        {
                            agent.SendAlertMessage(this.GetLanguageString(agent.CurrentCulture, "UnableToBuyNoEconomyConfigured", "Unable to buy. No economy configured."), ID);
                        }
                    }
                }
            }
        }