public string osDrawPolygon(string drawList, LSL_List x, LSL_List y) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "osDrawFilledPolygon", m_host, "OSSL", m_itemID)) return ""; if (x.Length != y.Length || x.Length < 3) { return new LSL_String(""); } drawList += "Polygon " + x.GetLSLStringItem(0) + "," + y.GetLSLStringItem(0); for (int i = 1; i < x.Length; i++) { drawList += "," + x.GetLSLStringItem(i) + "," + y.GetLSLStringItem(i); } drawList += "; "; return new LSL_String(drawList); }
public void osSetParcelDetails(LSL_Vector pos, LSL_List rules) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.High, "osSetParcelDetails", m_host, "OSSL", m_itemID)) return; // Get a reference to the land data and make sure the owner of the script // can modify it IParcelManagementModule parcelManagement = World.RequestModuleInterface<IParcelManagementModule>(); if (parcelManagement != null) { ILandObject startLandObject = parcelManagement.GetLandObject((int) pos.x, (int) pos.y); if (startLandObject == null) { OSSLShoutError("There is no land at that location"); return; } if (!World.Permissions.CanEditParcel(m_host.OwnerID, startLandObject)) { OSSLShoutError("You do not have permission to modify the parcel"); return; } // Create a new land data object we can modify // Process the rules, not sure what the impact would be of changing owner or group for (int idx = 0; idx < rules.Length;) { int code = rules.GetLSLIntegerItem(idx++); string arg = rules.GetLSLStringItem(idx++); UUID uuid; switch (code) { case 0: startLandObject.LandData.Name = arg; break; case 1: startLandObject.LandData.Description = arg; break; case 2: if ( !ScriptProtection.CheckThreatLevel(ThreatLevel.VeryHigh, "osSetParcelDetails", m_host, "OSSL", m_itemID)) return; if (UUID.TryParse(arg, out uuid)) startLandObject.LandData.OwnerID = uuid; break; case 3: if ( !ScriptProtection.CheckThreatLevel(ThreatLevel.VeryHigh, "osSetParcelDetails", m_host, "OSSL", m_itemID)) return; if (UUID.TryParse(arg, out uuid)) startLandObject.LandData.GroupID = uuid; break; } } parcelManagement.UpdateLandObject(startLandObject); } }
// This needs ThreatLevel high. It is an excellent griefer tool, // In a loop, it can cause asset bloat and DOS levels of asset // writes. // public void osMakeNotecard(string notecardName, LSL_List contents) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.High, "osMakeNotecard", m_host, "OSSL", m_itemID)) return; // Create new asset AssetBase asset = new AssetBase(UUID.Random(), notecardName, AssetType.Notecard, m_host.OwnerID) { Description = "Script Generated Notecard" }; string notecardData = String.Empty; for (int i = 0; i < contents.Length; i++) { notecardData += contents.GetLSLStringItem(i) + "\n"; } int textLength = notecardData.Length; notecardData = "Linden text version 2\n{\nLLEmbeddedItems version 1\n{\ncount 0\n}\nText length " + textLength.ToString(CultureInfo.InvariantCulture) + "\n" + notecardData + "}\n"; asset.Data = Util.UTF8.GetBytes(notecardData); asset.ID = World.AssetService.Store(asset); // Create Task Entry TaskInventoryItem taskItem = new TaskInventoryItem(); taskItem.ResetIDs(m_host.UUID); taskItem.ParentID = m_host.UUID; taskItem.CreationDate = (uint) Util.UnixTimeSinceEpoch(); taskItem.Name = asset.Name; taskItem.Description = asset.Description; taskItem.Type = (int) AssetType.Notecard; taskItem.InvType = (int) InventoryType.Notecard; taskItem.OwnerID = m_host.OwnerID; taskItem.CreatorID = m_host.OwnerID; taskItem.BasePermissions = (uint) PermissionMask.All; taskItem.CurrentPermissions = (uint) PermissionMask.All; taskItem.EveryonePermissions = 0; taskItem.NextPermissions = (uint) PermissionMask.All; taskItem.GroupID = m_host.GroupID; taskItem.GroupPermissions = 0; taskItem.Flags = 0; taskItem.SalePrice = 0; taskItem.SaleType = 0; taskItem.PermsGranter = UUID.Zero; taskItem.PermsMask = 0; taskItem.AssetID = asset.ID; m_host.Inventory.AddInventoryItem(taskItem, false); }
void ConvertLSLToWindlight (ref WindlightDayCycle cycle, int preset, LSL_List list) { var skyDatas = cycle.Cycle.DataSettings.Values.ToList (); var skyData = skyDatas [preset]; for (int i = 0; i < list.Data.Length; i += 2) { int key = list.GetLSLIntegerItem (i); switch (key) { case ScriptBaseClass.WL_AMBIENT: { LSL_Rotation rot = list.GetQuaternionItem (i + 1); skyData.ambient = rot.ToVector4 (); break; } case ScriptBaseClass.WL_CLOUD_COLOR: { LSL_Rotation rot = list.GetQuaternionItem (i + 1); skyData.cloud_color = rot.ToVector4 (); break; } case ScriptBaseClass.WL_CLOUD_POS_DENSITY1: { LSL_Rotation rot = list.GetQuaternionItem (i + 1); skyData.cloud_pos_density1 = rot.ToVector4 (); break; } case ScriptBaseClass.WL_CLOUD_POS_DENSITY2: { LSL_Rotation rot = list.GetQuaternionItem (i + 1); skyData.cloud_pos_density2 = rot.ToVector4 (); break; } case ScriptBaseClass.WL_CLOUD_SCALE: { LSL_Rotation rot = list.GetQuaternionItem (i + 1); skyData.cloud_scale = rot.ToVector4 (); break; } case ScriptBaseClass.WL_CLOUD_SCROLL_X: { LSL_Integer integer = list.GetLSLIntegerItem (i + 1); skyData.cloud_scroll_rate.X = integer; break; } case ScriptBaseClass.WL_CLOUD_SCROLL_Y: { LSL_Integer integer = list.GetLSLIntegerItem (i + 1); skyData.cloud_scroll_rate.Y = integer; break; } case ScriptBaseClass.WL_CLOUD_SCROLL_X_LOCK: { LSL_Integer integer = list.GetLSLIntegerItem (i + 1); skyData.enable_cloud_scroll.X = integer; break; } case ScriptBaseClass.WL_CLOUD_SCROLL_Y_LOCK: { LSL_Integer integer = list.GetLSLIntegerItem (i + 1); skyData.enable_cloud_scroll.Y = integer; break; } case ScriptBaseClass.WL_CLOUD_SHADOW: { LSL_Rotation rot = list.GetQuaternionItem (i + 1); skyData.cloud_shadow = rot.ToVector4 (); break; } case ScriptBaseClass.WL_SKY_BLUE_DENSITY: { LSL_Rotation rot = list.GetQuaternionItem (i + 1); skyData.blue_density = rot.ToVector4 (); break; } case ScriptBaseClass.WL_SKY_BLUR_HORIZON: { LSL_Rotation rot = list.GetQuaternionItem (i + 1); skyData.blue_horizon = rot.ToVector4 (); break; } case ScriptBaseClass.WL_SKY_DENSITY_MULTIPLIER: { LSL_Rotation rot = list.GetQuaternionItem (i + 1); skyData.density_multiplier = rot.ToVector4 (); break; } case ScriptBaseClass.WL_SKY_DISTANCE_MULTIPLIER: { LSL_Rotation rot = list.GetQuaternionItem (i + 1); skyData.distance_multiplier = rot.ToVector4 (); break; } case ScriptBaseClass.WL_SKY_GAMMA: { LSL_Rotation rot = list.GetQuaternionItem (i + 1); skyData.gamma = rot.ToVector4 (); break; } case ScriptBaseClass.WL_SKY_GLOW: { LSL_Rotation rot = list.GetQuaternionItem (i + 1); skyData.glow = rot.ToVector4 (); break; } case ScriptBaseClass.WL_SKY_HAZE_DENSITY: { LSL_Rotation rot = list.GetQuaternionItem (i + 1); skyData.haze_density = rot.ToVector4 (); break; } case ScriptBaseClass.WL_SKY_HAZE_HORIZON: { LSL_Rotation rot = list.GetQuaternionItem (i + 1); skyData.haze_horizon = rot.ToVector4 (); break; } case ScriptBaseClass.WL_SKY_LIGHT_NORMALS: { LSL_Rotation rot = list.GetQuaternionItem (i + 1); skyData.lightnorm = rot.ToVector4 (); break; } case ScriptBaseClass.WL_SKY_MAX_ALTITUDE: { LSL_Rotation rot = list.GetQuaternionItem (i + 1); skyData.max_y = rot.ToVector4 (); break; } case ScriptBaseClass.WL_SKY_STAR_BRIGHTNESS: { LSL_Float f = list.GetLSLFloatItem (i + 1); skyData.star_brightness = (float)f.value; break; } case ScriptBaseClass.WL_SKY_SUNLIGHT_COLOR: { LSL_Rotation rot = list.GetQuaternionItem (i + 1); skyData.sunlight_color = rot.ToVector4 (); break; } case ScriptBaseClass.WL_WATER_BIG_WAVE_DIRECTION: { var rot = list.GetVector3Item (i + 1); cycle.Water.wave1Dir = new Vector2 ((float)rot.x.value, (float)rot.y.value); break; } case ScriptBaseClass.WL_WATER_BLUR_MULTIPLIER: { var f = list.GetLSLFloatItem (i + 1); cycle.Water.blurMultiplier = (float)f.value; break; } case ScriptBaseClass.WL_WATER_FOG_COLOR: { LSL_Rotation rot = list.GetQuaternionItem (i + 1); cycle.Water.waterFogColor = rot.ToVector4 (); break; } case ScriptBaseClass.WL_WATER_FOG_DENSITY: { var f = list.GetLSLFloatItem (i + 1); cycle.Water.waterFogDensity = (float)f.value; break; } case ScriptBaseClass.WL_WATER_FRESNEL_OFFSET: { var f = list.GetLSLFloatItem (i + 1); cycle.Water.fresnelOffset = (float)f.value; break; } case ScriptBaseClass.WL_WATER_FRESNEL_SCALE: { var f = list.GetLSLFloatItem (i + 1); cycle.Water.fresnelScale = (float)f.value; break; } case ScriptBaseClass.WL_WATER_LITTLE_WAVE_DIRECTION: { var rot = list.GetVector3Item (i + 1); cycle.Water.wave2Dir = new Vector2 ((float)rot.x.value, (float)rot.y.value); break; } case ScriptBaseClass.WL_WATER_NORMAL_MAP: { var f = list.GetLSLStringItem (i + 1); cycle.Water.normalMap = UUID.Parse (f.m_string); break; } case ScriptBaseClass.WL_WATER_NORMAL_SCALE: { LSL_Vector rot = list.GetVector3Item (i + 1); cycle.Water.normScale = rot.ToVector3 (); break; } case ScriptBaseClass.WL_WATER_SCALE_ABOVE: { var f = list.GetLSLFloatItem (i + 1); cycle.Water.scaleAbove = (float)f.value; break; } case ScriptBaseClass.WL_WATER_SCALE_BELOW: { var f = list.GetLSLFloatItem (i + 1); cycle.Water.scaleBelow = (float)f.value; break; } case ScriptBaseClass.WL_WATER_UNDERWATER_FOG_MODIFIER: { var f = list.GetLSLFloatItem (i + 1); cycle.Water.underWaterFogMod = (float)f.value; break; } } } }
public LSL_String aaSerializeXML (LSL_List keys, LSL_List values) { if (!ScriptProtection.CheckThreatLevel (ThreatLevel.Moderate, "aaSerializeXML", m_host, "AA", m_itemID)) return new LSL_String (); XmlDocument doc = new XmlDocument (); for (int i = 0; i < keys.Length; i++) { string key = keys.GetLSLStringItem (i); string value = values.GetLSLStringItem (i); XmlNode node = doc.CreateNode (XmlNodeType.Element, key, ""); node.InnerText = value; doc.AppendChild (node); } return new LSL_String (doc.OuterXml); }
private void SetParticleSystem(ISceneChildEntity part, LSL_List rules) { if (rules.Length == 0) { part.RemoveParticleSystem(); } else { Primitive.ParticleSystem prules = getNewParticleSystemWithSLDefaultValues(); LSL_Vector tempv = new LSL_Vector(); float tempf = 0; int tmpi = 0; for (int i = 0; i < rules.Length; i += 2) { LSL_Integer rule = rules.GetLSLIntegerItem(i); if (rule == (int)ScriptBaseClass.PSYS_PART_FLAGS) { prules.PartDataFlags = (Primitive.ParticleSystem.ParticleDataFlags)(uint)rules.GetLSLIntegerItem(i + 1); } else if (rule == (int)ScriptBaseClass.PSYS_PART_START_COLOR) { tempv = rules.GetVector3Item(i + 1); prules.PartStartColor.R = (float)tempv.x; prules.PartStartColor.G = (float)tempv.y; prules.PartStartColor.B = (float)tempv.z; } else if (rule == (int)ScriptBaseClass.PSYS_PART_START_ALPHA) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.PartStartColor.A = tempf; } else if (rule == (int)ScriptBaseClass.PSYS_PART_END_COLOR) { tempv = rules.GetVector3Item(i + 1); prules.PartEndColor.R = (float)tempv.x; prules.PartEndColor.G = (float)tempv.y; prules.PartEndColor.B = (float)tempv.z; } else if (rule == (int)ScriptBaseClass.PSYS_PART_END_ALPHA) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.PartEndColor.A = tempf; } else if (rule == (int)ScriptBaseClass.PSYS_PART_START_SCALE) { tempv = rules.GetVector3Item(i + 1); prules.PartStartScaleX = (float)tempv.x; prules.PartStartScaleY = (float)tempv.y; } else if (rule == (int)ScriptBaseClass.PSYS_PART_END_SCALE) { tempv = rules.GetVector3Item(i + 1); prules.PartEndScaleX = (float)tempv.x; prules.PartEndScaleY = (float)tempv.y; } else if (rule == (int)ScriptBaseClass.PSYS_PART_MAX_AGE) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.PartMaxAge = tempf; } else if (rule == (int)ScriptBaseClass.PSYS_SRC_ACCEL) { tempv = rules.GetVector3Item(i + 1); prules.PartAcceleration.X = (float)tempv.x; prules.PartAcceleration.Y = (float)tempv.y; prules.PartAcceleration.Z = (float)tempv.z; } else if (rule == (int)ScriptBaseClass.PSYS_SRC_PATTERN) { tmpi = rules.GetLSLIntegerItem(i + 1); prules.Pattern = (Primitive.ParticleSystem.SourcePattern)tmpi; } // PSYS_SRC_INNERANGLE and PSYS_SRC_ANGLE_BEGIN use the same variables. The // PSYS_SRC_OUTERANGLE and PSYS_SRC_ANGLE_END also use the same variable. The // client tells the difference between the two by looking at the 0x02 bit in // the PartFlags variable. else if (rule == (int)ScriptBaseClass.PSYS_SRC_INNERANGLE) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.InnerAngle = tempf; prules.PartFlags &= 0xFFFFFFFD; // Make sure new angle format is off. } else if (rule == (int)ScriptBaseClass.PSYS_SRC_OUTERANGLE) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.OuterAngle = tempf; prules.PartFlags &= 0xFFFFFFFD; // Make sure new angle format is off. } else if (rule == (int)ScriptBaseClass.PSYS_PART_BLEND_FUNC_SOURCE) { tmpi = (int)rules.GetLSLIntegerItem(i + 1); prules.BlendFuncSource = (byte)tmpi; } else if (rule == (int)ScriptBaseClass.PSYS_PART_BLEND_FUNC_DEST) { tmpi = (int)rules.GetLSLIntegerItem(i + 1); prules.BlendFuncDest = (byte)tmpi; } else if (rule == (int)ScriptBaseClass.PSYS_PART_START_GLOW) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.PartStartGlow = (float)tempf; } else if (rule == (int)ScriptBaseClass.PSYS_PART_END_GLOW) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.PartEndGlow = (float)tempf; } else if (rule == (int)ScriptBaseClass.PSYS_SRC_TEXTURE) { prules.Texture = KeyOrName(rules.GetLSLStringItem(i + 1), AssetType.Texture, false); } else if (rule == (int)ScriptBaseClass.PSYS_SRC_BURST_RATE) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.BurstRate = tempf; } else if (rule == (int)ScriptBaseClass.PSYS_SRC_BURST_PART_COUNT) { prules.BurstPartCount = (byte)(int)rules.GetLSLIntegerItem(i + 1); } else if (rule == (int)ScriptBaseClass.PSYS_SRC_BURST_RADIUS) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.BurstRadius = tempf; } else if (rule == (int)ScriptBaseClass.PSYS_SRC_BURST_SPEED_MIN) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.BurstSpeedMin = tempf; } else if (rule == (int)ScriptBaseClass.PSYS_SRC_BURST_SPEED_MAX) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.BurstSpeedMax = tempf; } else if (rule == (int)ScriptBaseClass.PSYS_SRC_MAX_AGE) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.MaxAge = tempf; } else if (rule == (int)ScriptBaseClass.PSYS_SRC_TARGET_KEY) { UUID key = UUID.Zero; prules.Target = UUID.TryParse(rules.Data[i + 1].ToString(), out key) ? key : part.UUID; } else if (rule == (int)ScriptBaseClass.PSYS_SRC_OMEGA) { // AL: This is an assumption, since it is the only thing that would match. tempv = rules.GetVector3Item(i + 1); prules.AngularVelocity.X = (float)tempv.x; prules.AngularVelocity.Y = (float)tempv.y; prules.AngularVelocity.Z = (float)tempv.z; } else if (rule == (int)ScriptBaseClass.PSYS_SRC_ANGLE_BEGIN) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.InnerAngle = tempf; prules.PartFlags |= 0x02; // Set new angle format. } else if (rule == (int)ScriptBaseClass.PSYS_SRC_ANGLE_END) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.OuterAngle = tempf; prules.PartFlags |= 0x02; // Set new angle format. } } prules.CRC = 1; part.AddNewParticleSystem(prules); } part.ScheduleUpdate(PrimUpdateFlags.Particles); }
public void SetPrimParams(IEntity part, LSL_List rules, bool allowOpenSimParams) { int idx = 0; while (idx < rules.Length) { int code = rules.GetLSLIntegerItem(idx++); int remain = rules.Length - idx; int face; LSL_Vector v; if (code == (int)ScriptBaseClass.PRIM_NAME) { if (remain < 1) return; string name = rules.Data[idx++].ToString(); if (part is ISceneChildEntity) (part as ISceneChildEntity).Name = name; } else if (code == (int)ScriptBaseClass.PRIM_DESC) { if (remain < 1) return; string desc = rules.Data[idx++].ToString(); if (part is ISceneChildEntity) (part as ISceneChildEntity).Description = desc; } else if (code == (int)ScriptBaseClass.PRIM_ROT_LOCAL) { if (remain < 1) return; LSL_Rotation lr = rules.GetQuaternionItem(idx++); if (part is ISceneChildEntity) SetRot((part as ISceneChildEntity), Rot2Quaternion(lr)); } else if (code == (int)ScriptBaseClass.PRIM_POSITION) { if (remain < 1) return; v = rules.GetVector3Item(idx++); if (part is ISceneChildEntity) //SetPos(part as ISceneChildEntity, GetPartLocalPos(part as ISceneChildEntity) + v, true); SetPos(part as ISceneChildEntity, v, true); else if (part is IScenePresence) { (part as IScenePresence).OffsetPosition = new Vector3((float)v.x, (float)v.y, (float)v.z); (part as IScenePresence).SendTerseUpdateToAllClients(); } } else if (code == (int)ScriptBaseClass.PRIM_POS_LOCAL) { if (remain < 1) return; v = rules.GetVector3Item(idx++); if (part is ISceneChildEntity) { if (((ISceneChildEntity)part).ParentID != 0) ((ISceneChildEntity)part).OffsetPosition = new Vector3((float)v.x, (float)v.y, (float)v.z); else part.AbsolutePosition = new Vector3((float)v.x, (float)v.y, (float)v.z); } else if (part is IScenePresence) { (part as IScenePresence).OffsetPosition = new Vector3((float)v.x, (float)v.y, (float)v.z); (part as IScenePresence).SendTerseUpdateToAllClients(); } } else if (code == (int)ScriptBaseClass.PRIM_SIZE) { if (remain < 1) return; v = rules.GetVector3Item(idx++); if (part is ISceneChildEntity) SetScale(part as ISceneChildEntity, v); } else if (code == (int)ScriptBaseClass.PRIM_ROTATION) { if (remain < 1) return; LSL_Rotation q = rules.GetQuaternionItem(idx++); if (part is ISceneChildEntity) { // try to let this work as in SL... if ((part as ISceneChildEntity).ParentID == 0) { // special case: If we are root, rotate complete SOG to new rotation SetRot(part as ISceneChildEntity, Rot2Quaternion(q)); } else { // we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask. ISceneEntity group = (part as ISceneChildEntity).ParentEntity; if (group != null) // a bit paranoid, maybe { ISceneChildEntity rootPart = group.RootChild; if (rootPart != null) // again, better safe than sorry { SetRot((part as ISceneChildEntity), rootPart.GetRotationOffset() * Rot2Quaternion(q)); } } } } else if (part is IScenePresence) { IScenePresence sp = (IScenePresence)part; ISceneChildEntity childObj = sp.Scene.GetSceneObjectPart(sp.SittingOnUUID); if (childObj != null) { sp.Rotation = childObj.ParentEntity.GroupRotation * Rot2Quaternion(q); sp.SendTerseUpdateToAllClients(); } } } else if (code == (int)ScriptBaseClass.PRIM_TYPE) { if (remain < 3) return; if (part is ISceneChildEntity) { } else return; code = rules.GetLSLIntegerItem(idx++); remain = rules.Length - idx; float hollow; LSL_Vector twist; LSL_Vector taper_b; LSL_Vector topshear; float revolutions; float radiusoffset; float skew; LSL_Vector holesize; LSL_Vector profilecut; if (code == (int)ScriptBaseClass.PRIM_TYPE_BOX) { if (remain < 6) return; face = rules.GetLSLIntegerItem(idx++); v = rules.GetVector3Item(idx++); // cut hollow = (float)rules.GetLSLFloatItem(idx++); twist = rules.GetVector3Item(idx++); taper_b = rules.GetVector3Item(idx++); topshear = rules.GetVector3Item(idx++); (part as ISceneChildEntity).Shape.PathCurve = (byte)Extrusion.Straight; SetPrimitiveShapeParams((part as ISceneChildEntity), face, v, hollow, twist, taper_b, topshear, 1); } else if (code == (int)ScriptBaseClass.PRIM_TYPE_CYLINDER) { if (remain < 6) return; face = rules.GetLSLIntegerItem(idx++); // holeshape v = rules.GetVector3Item(idx++); // cut hollow = (float)rules.GetLSLFloatItem(idx++); twist = rules.GetVector3Item(idx++); taper_b = rules.GetVector3Item(idx++); topshear = rules.GetVector3Item(idx++); (part as ISceneChildEntity).Shape.ProfileShape = ProfileShape.Circle; (part as ISceneChildEntity).Shape.PathCurve = (byte)Extrusion.Straight; SetPrimitiveShapeParams((part as ISceneChildEntity), face, v, hollow, twist, taper_b, topshear, 0); } else if (code == (int)ScriptBaseClass.PRIM_TYPE_PRISM) { if (remain < 6) return; face = rules.GetLSLIntegerItem(idx++); // holeshape v = rules.GetVector3Item(idx++); //cut hollow = (float)rules.GetLSLFloatItem(idx++); twist = rules.GetVector3Item(idx++); taper_b = rules.GetVector3Item(idx++); topshear = rules.GetVector3Item(idx++); (part as ISceneChildEntity).Shape.PathCurve = (byte)Extrusion.Straight; SetPrimitiveShapeParams((part as ISceneChildEntity), face, v, hollow, twist, taper_b, topshear, 3); } else if (code == (int)ScriptBaseClass.PRIM_TYPE_SPHERE) { if (remain < 5) return; face = rules.GetLSLIntegerItem(idx++); // holeshape v = rules.GetVector3Item(idx++); // cut hollow = (float)rules.GetLSLFloatItem(idx++); twist = rules.GetVector3Item(idx++); taper_b = rules.GetVector3Item(idx++); // dimple (part as ISceneChildEntity).Shape.PathCurve = (byte)Extrusion.Curve1; SetPrimitiveShapeParams((part as ISceneChildEntity), face, v, hollow, twist, taper_b, 5); } else if (code == (int)ScriptBaseClass.PRIM_TYPE_TORUS) { if (remain < 11) return; face = rules.GetLSLIntegerItem(idx++); // holeshape v = rules.GetVector3Item(idx++); //cut hollow = (float)rules.GetLSLFloatItem(idx++); twist = rules.GetVector3Item(idx++); holesize = rules.GetVector3Item(idx++); topshear = rules.GetVector3Item(idx++); profilecut = rules.GetVector3Item(idx++); taper_b = rules.GetVector3Item(idx++); // taper_a revolutions = (float)rules.GetLSLFloatItem(idx++); radiusoffset = (float)rules.GetLSLFloatItem(idx++); skew = (float)rules.GetLSLFloatItem(idx++); (part as ISceneChildEntity).Shape.PathCurve = (byte)Extrusion.Curve1; SetPrimitiveShapeParams((part as ISceneChildEntity), face, v, hollow, twist, holesize, topshear, profilecut, taper_b, revolutions, radiusoffset, skew, 0); } else if (code == (int)ScriptBaseClass.PRIM_TYPE_TUBE) { if (remain < 11) return; face = rules.GetLSLIntegerItem(idx++); // holeshape v = rules.GetVector3Item(idx++); //cut hollow = (float)rules.GetLSLFloatItem(idx++); twist = rules.GetVector3Item(idx++); holesize = rules.GetVector3Item(idx++); topshear = rules.GetVector3Item(idx++); profilecut = rules.GetVector3Item(idx++); taper_b = rules.GetVector3Item(idx++); // taper_a revolutions = (float)rules.GetLSLFloatItem(idx++); radiusoffset = (float)rules.GetLSLFloatItem(idx++); skew = (float)rules.GetLSLFloatItem(idx++); (part as ISceneChildEntity).Shape.PathCurve = (byte)Extrusion.Curve1; SetPrimitiveShapeParams((part as ISceneChildEntity), face, v, hollow, twist, holesize, topshear, profilecut, taper_b, revolutions, radiusoffset, skew, 1); } else if (code == (int)ScriptBaseClass.PRIM_TYPE_RING) { if (remain < 11) return; face = rules.GetLSLIntegerItem(idx++); // holeshape v = rules.GetVector3Item(idx++); //cut hollow = (float)rules.GetLSLFloatItem(idx++); twist = rules.GetVector3Item(idx++); holesize = rules.GetVector3Item(idx++); topshear = rules.GetVector3Item(idx++); profilecut = rules.GetVector3Item(idx++); taper_b = rules.GetVector3Item(idx++); // taper_a revolutions = (float)rules.GetLSLFloatItem(idx++); radiusoffset = (float)rules.GetLSLFloatItem(idx++); skew = (float)rules.GetLSLFloatItem(idx++); (part as ISceneChildEntity).Shape.PathCurve = (byte)Extrusion.Curve1; SetPrimitiveShapeParams((part as ISceneChildEntity), face, v, hollow, twist, holesize, topshear, profilecut, taper_b, revolutions, radiusoffset, skew, 3); } else if (code == (int)ScriptBaseClass.PRIM_TYPE_SCULPT) { if (remain < 2) return; string map = rules.Data[idx++].ToString(); face = rules.GetLSLIntegerItem(idx++); // type (part as ISceneChildEntity).Shape.PathCurve = (byte)Extrusion.Curve1; SetPrimitiveShapeParams((part as ISceneChildEntity), map, face); } } else if (code == (int)ScriptBaseClass.PRIM_TEXTURE) { if (remain < 5) return; if (part is ISceneChildEntity) { } else return; face = rules.GetLSLIntegerItem(idx++); string tex = rules.Data[idx++].ToString(); LSL_Vector repeats = rules.GetVector3Item(idx++); LSL_Vector offsets = rules.GetVector3Item(idx++); double rotation = rules.GetLSLFloatItem(idx++); SetTexture((part as ISceneChildEntity), tex, face); ScaleTexture((part as ISceneChildEntity), repeats.x, repeats.y, face); OffsetTexture((part as ISceneChildEntity), offsets.x, offsets.y, face); RotateTexture((part as ISceneChildEntity), rotation, face); } else if (code == (int)ScriptBaseClass.PRIM_COLOR) { if (remain < 3) return; if (part is ISceneChildEntity) { } else return; face = rules.GetLSLIntegerItem(idx++); LSL_Vector color = rules.GetVector3Item(idx++); double alpha = rules.GetLSLFloatItem(idx++); (part as ISceneChildEntity).SetFaceColor( new Vector3((float)color.x, (float)color.y, (float)color.z), face); SetAlpha((part as ISceneChildEntity), alpha, face); } else if (code == (int)ScriptBaseClass.PRIM_FLEXIBLE) { if (remain < 7) return; if (!(part is ISceneChildEntity)) return; bool flexi = rules.GetLSLIntegerItem(idx++); int softness = rules.GetLSLIntegerItem(idx++); float gravity = (float)rules.GetLSLFloatItem(idx++); float friction = (float)rules.GetLSLFloatItem(idx++); float wind = (float)rules.GetLSLFloatItem(idx++); float tension = (float)rules.GetLSLFloatItem(idx++); LSL_Vector force = rules.GetVector3Item(idx++); SetFlexi((part as ISceneChildEntity), flexi, softness, gravity, friction, wind, tension, force); } else if (code == (int)ScriptBaseClass.PRIM_POINT_LIGHT) { if (remain < 5) return; if (!(part is ISceneChildEntity)) return; bool light = rules.GetLSLIntegerItem(idx++); LSL_Vector lightcolor = rules.GetVector3Item(idx++); float intensity = (float)rules.GetLSLFloatItem(idx++); float radius = (float)rules.GetLSLFloatItem(idx++); float falloff = (float)rules.GetLSLFloatItem(idx++); SetPointLight((part as ISceneChildEntity), light, lightcolor, intensity, radius, falloff); } else if (code == (int)ScriptBaseClass.PRIM_GLOW) { if (remain < 2) return; if (!(part is ISceneChildEntity)) return; face = rules.GetLSLIntegerItem(idx++); float glow = (float)rules.GetLSLFloatItem(idx++); SetGlow((part as ISceneChildEntity), face, glow); } else if (code == (int)ScriptBaseClass.PRIM_BUMP_SHINY) { if (remain < 3) return; if (!(part is ISceneChildEntity)) return; face = rules.GetLSLIntegerItem(idx++); int shiny = rules.GetLSLIntegerItem(idx++); Bumpiness bump = (Bumpiness)Convert.ToByte((int)rules.GetLSLIntegerItem(idx++)); SetShiny(part as ISceneChildEntity, face, shiny, bump); } else if (code == (int)ScriptBaseClass.PRIM_FULLBRIGHT) { if (remain < 2) return; if (!(part is ISceneChildEntity)) return; face = rules.GetLSLIntegerItem(idx++); bool st = rules.GetLSLIntegerItem(idx++); SetFullBright(part as ISceneChildEntity, face, st); } else if (code == (int)ScriptBaseClass.PRIM_MATERIAL) { if (remain < 1) return; if (!(part is ISceneChildEntity)) return; int mat = rules.GetLSLIntegerItem(idx++); if (mat < 0 || mat > 7) return; (part as ISceneChildEntity).UpdateMaterial(mat); } else if (code == (int)ScriptBaseClass.PRIM_PHANTOM) { if (remain < 1) return; if (!(part is ISceneChildEntity)) return; string ph = rules.Data[idx++].ToString(); bool phantom = ph.Equals("1"); (part as ISceneChildEntity).ScriptSetPhantomStatus(phantom); } else if (code == (int)ScriptBaseClass.PRIM_PHYSICS) { if (remain < 1) return; if (!(part is ISceneChildEntity)) return; string phy = rules.Data[idx++].ToString(); m_host.ParentEntity.ScriptSetPhysicsStatus(phy.Equals("1")); } else if (code == (int)ScriptBaseClass.PRIM_TEMP_ON_REZ) { if (remain < 1) return; if (!(part is ISceneChildEntity)) return; string temp = rules.Data[idx++].ToString(); bool tempOnRez = temp.Equals("1"); (part as ISceneChildEntity).ScriptSetTemporaryStatus(tempOnRez); } else if (code == (int)ScriptBaseClass.PRIM_TEXGEN) { if (remain < 2) return; if (!(part is ISceneChildEntity)) return; //face,type face = rules.GetLSLIntegerItem(idx++); int style = rules.GetLSLIntegerItem(idx++); SetTexGen((part as ISceneChildEntity), face, style); } else if (code == (int)ScriptBaseClass.PRIM_TEXT) { if (remain < 3) return; if (!(part is ISceneChildEntity)) return; string primText = rules.GetLSLStringItem(idx++); LSL_Vector primTextColor = rules.GetVector3Item(idx++); LSL_Float primTextAlpha = rules.GetLSLFloatItem(idx++); Vector3 av3 = new Vector3(Util.Clip((float)primTextColor.x, 0.0f, 1.0f), Util.Clip((float)primTextColor.y, 0.0f, 1.0f), Util.Clip((float)primTextColor.z, 0.0f, 1.0f)); (part as ISceneChildEntity).SetText(primText, av3, Util.Clip((float)primTextAlpha, 0.0f, 1.0f)); } else if (code == (int)ScriptBaseClass.PRIM_OMEGA) { if (remain < 3) return; LSL_Vector direction = rules.GetVector3Item(idx++); LSL_Float spinrate = rules.GetLSLFloatItem(idx++); LSL_Float gain = rules.GetLSLFloatItem(idx++); if (part is ISceneChildEntity) llTargetOmega(direction, spinrate, gain); } else if (code == (int)ScriptBaseClass.PRIM_PHYSICS_SHAPE_TYPE) { bool UsePhysics = ((m_host.Flags & PrimFlags.Physics) != 0); bool IsTemporary = ((m_host.Flags & PrimFlags.TemporaryOnRez) != 0); bool IsPhantom = ((m_host.Flags & PrimFlags.Phantom) != 0); bool IsVolumeDetect = m_host.VolumeDetectActive; ObjectFlagUpdatePacket.ExtraPhysicsBlock[] blocks = new ObjectFlagUpdatePacket.ExtraPhysicsBlock[1]; blocks[0] = new ObjectFlagUpdatePacket.ExtraPhysicsBlock { Density = m_host.Density, Friction = m_host.Friction, GravityMultiplier = m_host.GravityMultiplier }; LSL_Integer shapeType = rules.GetLSLIntegerItem(idx++); if (shapeType == ScriptBaseClass.PRIM_PHYSICS_SHAPE_PRIM) blocks[0].PhysicsShapeType = (byte)shapeType.value; else if (shapeType == ScriptBaseClass.PRIM_PHYSICS_SHAPE_NONE) blocks[0].PhysicsShapeType = (byte)shapeType.value; else //if(shapeType == ScriptBaseClass.PRIM_PHYSICS_SHAPE_CONVEX) blocks[0].PhysicsShapeType = (byte)shapeType.value; blocks[0].Restitution = m_host.Restitution; if (part is ISceneChildEntity) if ((part as ISceneChildEntity).UpdatePrimFlags(UsePhysics, IsTemporary, IsPhantom, IsVolumeDetect, blocks)) (part as ISceneChildEntity).ParentEntity.RebuildPhysicalRepresentation(true, null); } else if (code == (int)ScriptBaseClass.PRIM_LINK_TARGET) { if (remain < 1) return; LSL_Integer nextLink = rules.GetLSLIntegerItem(idx++); List<IEntity> entities = GetLinkPartsAndEntities(nextLink); if (entities.Count > 0) part = entities[0]; } else if (code == (int)ScriptBaseClass.OS_PRIM_PROJECTION) { if (remain < 5 || !allowOpenSimParams) return; bool projection = rules.GetLSLIntegerItem(idx++) != 0; string texture = rules.GetLSLStringItem(idx++); UUID textureKey; UUID.TryParse(texture, out textureKey); float fov = (float)rules.GetLSLFloatItem(idx++); float focus = (float)rules.GetLSLFloatItem(idx++); float ambiance = (float)rules.GetLSLFloatItem(idx++); if (part is ISceneChildEntity) { (part as ISceneChildEntity).Shape.ProjectionEntry = projection; (part as ISceneChildEntity).Shape.ProjectionTextureUUID = textureKey; (part as ISceneChildEntity).Shape.ProjectionFOV = fov; (part as ISceneChildEntity).Shape.ProjectionFocus = focus; (part as ISceneChildEntity).Shape.ProjectionAmbiance = ambiance; (part as ISceneChildEntity).ScheduleUpdate(PrimUpdateFlags.FullUpdate); } } else if (code == (int)ScriptBaseClass.OS_PRIM_VELOCITY) { if (remain < 1 || !allowOpenSimParams) return; LSL_Vector velocity = rules.GetVector3Item(idx++); (part as ISceneChildEntity).Velocity = velocity.ToVector3(); (part as ISceneChildEntity).ScheduleTerseUpdate(); } else if (code == (int)ScriptBaseClass.OS_PRIM_ACCELERATION) { if (remain < 1 || !allowOpenSimParams) return; LSL_Vector accel = rules.GetVector3Item(idx++); (part as ISceneChildEntity).Acceleration = accel.ToVector3(); (part as ISceneChildEntity).ScheduleTerseUpdate(); } } }
public LSL_Integer SetPrimMediaParams(ISceneChildEntity obj, int face, LSL_List rules) { IMoapModule module = World.RequestModuleInterface<IMoapModule>(); if (null == module) throw new Exception("Media on a prim functions not available"); MediaEntry me = module.GetMediaEntry(obj, face) ?? new MediaEntry(); int i = 0; while (i < rules.Length - 1) { int code = rules.GetLSLIntegerItem(i++); if (code == ScriptBaseClass.PRIM_MEDIA_ALT_IMAGE_ENABLE) { me.EnableAlterntiveImage = (rules.GetLSLIntegerItem(i++) != 0); } else if (code == ScriptBaseClass.PRIM_MEDIA_CONTROLS) { int v = rules.GetLSLIntegerItem(i++); me.Controls = ScriptBaseClass.PRIM_MEDIA_CONTROLS_STANDARD == v ? MediaControls.Standard : MediaControls.Mini; } else if (code == ScriptBaseClass.PRIM_MEDIA_CURRENT_URL) { me.CurrentURL = rules.GetLSLStringItem(i++); } else if (code == ScriptBaseClass.PRIM_MEDIA_HOME_URL) { me.HomeURL = rules.GetLSLStringItem(i++); } else if (code == ScriptBaseClass.PRIM_MEDIA_AUTO_LOOP) { me.AutoLoop = (ScriptBaseClass.TRUE == rules.GetLSLIntegerItem(i++)); } else if (code == ScriptBaseClass.PRIM_MEDIA_AUTO_PLAY) { me.AutoPlay = (ScriptBaseClass.TRUE == rules.GetLSLIntegerItem(i++)); } else if (code == ScriptBaseClass.PRIM_MEDIA_AUTO_SCALE) { me.AutoScale = (ScriptBaseClass.TRUE == rules.GetLSLIntegerItem(i++)); } else if (code == ScriptBaseClass.PRIM_MEDIA_AUTO_ZOOM) { me.AutoZoom = (ScriptBaseClass.TRUE == rules.GetLSLIntegerItem(i++)); } else if (code == ScriptBaseClass.PRIM_MEDIA_FIRST_CLICK_INTERACT) { me.InteractOnFirstClick = (ScriptBaseClass.TRUE == rules.GetLSLIntegerItem(i++)); } else if (code == ScriptBaseClass.PRIM_MEDIA_WIDTH_PIXELS) { me.Width = rules.GetLSLIntegerItem(i++); } else if (code == ScriptBaseClass.PRIM_MEDIA_HEIGHT_PIXELS) { me.Height = rules.GetLSLIntegerItem(i++); } else if (code == ScriptBaseClass.PRIM_MEDIA_WHITELIST_ENABLE) { me.EnableWhiteList = (ScriptBaseClass.TRUE == rules.GetLSLIntegerItem(i++)); } else if (code == ScriptBaseClass.PRIM_MEDIA_WHITELIST) { string[] rawWhiteListUrls = rules.GetLSLStringItem(i++).ToString().Split(new[] { ',' }); List<string> whiteListUrls = new List<string>(); Array.ForEach( rawWhiteListUrls, rawUrl => whiteListUrls.Add(rawUrl.Trim())); me.WhiteList = whiteListUrls.ToArray(); } else if (code == ScriptBaseClass.PRIM_MEDIA_PERMS_INTERACT) { me.InteractPermissions = (MediaPermission)(byte)(int)rules.GetLSLIntegerItem(i++); } else if (code == ScriptBaseClass.PRIM_MEDIA_PERMS_CONTROL) { me.ControlPermissions = (MediaPermission)(byte)(int)rules.GetLSLIntegerItem(i++); } } module.SetMediaEntry(obj, face, me); return ScriptBaseClass.STATUS_OK; }