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); } }
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); } }
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; } }
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); }
private bool IsObjectScripted(Object.ObjectGroup grp) { foreach (ObjectPart p in grp.Values) { if (p.IsScripted) { return(true); } } return(false); }
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; } }
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)); }
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); } } } } }