public void botSetMap(string keyOfBot, LSL_List positions, LSL_List movementType, LSL_Integer flags) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.Moderate, "botSetMap", m_host, "bot", m_itemID)) { return; } List <Vector3> PositionsMap = new List <Vector3>(); for (int i = 0; i < positions.Length; i++) { LSL_Vector pos = positions.GetVector3Item(i); PositionsMap.Add(new Vector3((float)pos.x, (float)pos.y, (float)pos.z)); } List <TravelMode> TravelMap = new List <TravelMode>(); for (int i = 0; i < movementType.Length; i++) { LSL_Integer travel = movementType.GetLSLIntegerItem(i); TravelMap.Add((TravelMode)travel.value); } IBotManager manager = World.RequestModuleInterface <IBotManager>(); if (manager != null) { manager.SetBotMap(UUID.Parse(keyOfBot), PositionsMap, TravelMap, flags.value, m_host.OwnerID); } }
public LSL_List botGetBotsWithTag(string tag) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.Moderate, "botGetBotsWithTag", m_host, "bot", m_itemID)) { return(new LSL_List()); } IBotManager manager = World.RequestModuleInterface <IBotManager>(); List <UUID> bots = new List <UUID>(); if (manager != null) { bots = manager.GetBotsWithTag(tag); } LSL_List b = new LSL_List(); foreach (UUID bot in bots) { b.Add(bot.ToString()); } return(b); }
public LSL_List botGetBotsWithTag(string tag) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.Moderate, "botGetBotsWithTag", m_host, "bot", m_itemID)) return new LSL_List(); IBotManager manager = World.RequestModuleInterface<IBotManager>(); List<UUID> bots = new List<UUID>(); if (manager != null) bots = manager.GetBotsWithTag(tag); LSL_List b = new LSL_List(); foreach (UUID bot in bots) b.Add(bot.ToString()); return b; }
public LSL_List aaWindlightGetScene(int dayCycleIndex, LSL_List rules) { IEnvironmentSettingsModule environmentSettings = World.RequestModuleInterface<IEnvironmentSettingsModule>(); if (environmentSettings == null) return new LSL_List(new object[2] {ScriptBaseClass.WL_ERROR, ScriptBaseClass.WL_ERROR_NO_SCENE_SET}); WindlightDayCycle cycle = environmentSettings.GetCurrentDayCycle(); if (cycle == null) return new LSL_List(new object[2] {ScriptBaseClass.WL_ERROR, ScriptBaseClass.WL_ERROR_NO_SCENE_SET}); if (cycle.Cycle.IsStaticDayCycle) return new LSL_List(new object[2] {ScriptBaseClass.WL_ERROR, ScriptBaseClass.WL_ERROR_SCENE_MUST_NOT_BE_STATIC}); if (dayCycleIndex >= cycle.Cycle.DataSettings.Count) return new LSL_List(new object[2] {ScriptBaseClass.WL_ERROR, ScriptBaseClass.WL_ERROR_NO_PRESET_FOUND}); LSL_List list = new LSL_List(); for (int i = 0; i < rules.Data.Length; i++) { int rule = rules.GetLSLIntegerItem(i); ConvertWindlightDayCycle(cycle, dayCycleIndex, rule, ref list); } return list; }
public void aaSetEnv(LSL_String name, LSL_List value) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.VeryHigh, "aaSetEnv", m_host, "AA", m_itemID)) return; if (!World.Permissions.IsGod(m_host.OwnerID)) { LSLError("You do not have god permissions."); return; } if (name == ScriptBaseClass.ENABLE_GRAVITY) { LSL_Integer enabled = value.GetLSLIntegerItem(0); float[] grav = m_host.ParentEntity.Scene.PhysicsScene.GetGravityForce(); m_host.ParentEntity.Scene.PhysicsScene.SetGravityForce(enabled == 1, grav[0], grav[1], grav[2]); } else if (name == ScriptBaseClass.GRAVITY_FORCE_X) { LSL_Float f = value.GetLSLFloatItem(0); float[] grav = m_host.ParentEntity.Scene.PhysicsScene.GetGravityForce(); m_host.ParentEntity.Scene.PhysicsScene.SetGravityForce(true, (float) f.value, grav[1], grav[2]); } else if (name == ScriptBaseClass.GRAVITY_FORCE_Y) { LSL_Float f = value.GetLSLFloatItem(0); float[] grav = m_host.ParentEntity.Scene.PhysicsScene.GetGravityForce(); m_host.ParentEntity.Scene.PhysicsScene.SetGravityForce(true, grav[0], (float) f.value, grav[2]); } else if (name == ScriptBaseClass.GRAVITY_FORCE_Z) { LSL_Float f = value.GetLSLFloatItem(0); float[] grav = m_host.ParentEntity.Scene.PhysicsScene.GetGravityForce(); m_host.ParentEntity.Scene.PhysicsScene.SetGravityForce(true, grav[0], grav[1], (float) f.value); } else if (name == ScriptBaseClass.ADD_GRAVITY_POINT) { LSL_Vector pos = value.GetVector3Item(0); LSL_Float gravForce = value.GetLSLFloatItem(1); LSL_Float radius = value.GetLSLFloatItem(2); LSL_Integer ident = value.GetLSLIntegerItem(3); m_host.ParentEntity.Scene.PhysicsScene.AddGravityPoint(false, new Vector3((float) pos.x, (float) pos.y, (float) pos.z), 0, 0, 0, (float) gravForce.value, (float) radius.value, ident.value); } else if (name == ScriptBaseClass.ADD_GRAVITY_FORCE) { LSL_Vector pos = value.GetVector3Item(0); LSL_Float xForce = value.GetLSLFloatItem(1); LSL_Float yForce = value.GetLSLFloatItem(2); LSL_Float zForce = value.GetLSLFloatItem(3); LSL_Float radius = value.GetLSLFloatItem(4); LSL_Integer ident = value.GetLSLIntegerItem(5); m_host.ParentEntity.Scene.PhysicsScene.AddGravityPoint(true, new Vector3((float) pos.x, (float) pos.y, (float) pos.z), (float) xForce, (float) yForce, (float) zForce, 0, (float) radius.value, ident.value); } else if (name == ScriptBaseClass.START_TIME_REVERSAL_SAVING) { IPhysicsStateModule physicsState = World.RequestModuleInterface<IPhysicsStateModule>(); if (physicsState != null) physicsState.StartSavingPhysicsTimeReversalStates(); } else if (name == ScriptBaseClass.STOP_TIME_REVERSAL_SAVING) { IPhysicsStateModule physicsState = World.RequestModuleInterface<IPhysicsStateModule>(); if (physicsState != null) physicsState.StopSavingPhysicsTimeReversalStates(); } else if (name == ScriptBaseClass.START_TIME_REVERSAL) { IPhysicsStateModule physicsState = World.RequestModuleInterface<IPhysicsStateModule>(); if (physicsState != null) physicsState.StartPhysicsTimeReversal(); } else if (name == ScriptBaseClass.STOP_TIME_REVERSAL) { IPhysicsStateModule physicsState = World.RequestModuleInterface<IPhysicsStateModule>(); if (physicsState != null) physicsState.StopPhysicsTimeReversal(); } }
public LSL_List aaQueryDatabase(LSL_String key, LSL_String token) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.Moderate, "aaQueryDatabase", m_host, "AA", m_itemID)) return new LSL_List(); List<string> query = AssetConnector.FindLSLData(token.m_string, key.m_string); LSL_List list = new LSL_List(query.ToArray()); return list; }
public LSL_List aaDeserializeXMLValues(LSL_String xmlFile) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.Moderate, "aaDeserializeXMLValues", m_host, "AA", m_itemID)) return new LSL_List(); XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlFile.m_string); XmlNodeList children = doc.ChildNodes; LSL_List values = new LSL_List(); foreach (XmlNode node in children) { values.Add(node.InnerText); } return values; }
private 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_List llGetLinkPrimitiveParams(int linknumber, LSL_List rules) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) return new LSL_List(); List<ISceneChildEntity> parts = GetLinkParts(linknumber); LSL_List res = new LSL_List(); return parts.Select(part => GetLinkPrimitiveParams(part, rules, m_allowOpenSimParams)) .Aggregate(res, (current, partRes) => current + partRes); }
public void llGiveInventoryList(string destination, string category, LSL_List inventory) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) return; UUID destID; if (!UUID.TryParse(destination, out destID)) return; List<UUID> itemList = new List<UUID>(); foreach (object item in inventory.Data) { UUID itemID; if (UUID.TryParse(item.ToString(), out itemID)) { itemList.Add(itemID); } else { itemID = GetTaskInventoryItem(item.ToString()); if (itemID != UUID.Zero) itemList.Add(itemID); } } if (itemList.Count == 0) return; UUID folderID = UUID.Zero; ILLClientInventory inventoryModule = World.RequestModuleInterface<ILLClientInventory>(); if (inventoryModule != null) folderID = inventoryModule.MoveTaskInventoryItemsToUserInventory(destID, category, m_host, itemList); if (folderID == UUID.Zero) return; byte[] bucket = new byte[17]; bucket[0] = (byte)AssetType.Folder; byte[] objBytes = folderID.GetBytes(); Array.Copy(objBytes, 0, bucket, 1, 16); GridInstantMessage msg = new GridInstantMessage() { FromAgentID = m_host.UUID, FromAgentName = m_host.Name + ", an object owned by " + resolveName(m_host.OwnerID) + ",", ToAgentID = destID, Dialog = (byte)InstantMessageDialog.InventoryOffered, Message = category + "\n" + m_host.Name + " is located at " + World.RegionInfo.RegionName + " " + m_host.AbsolutePosition, SessionID = folderID, Offline = 1, Position = m_host.AbsolutePosition, BinaryBucket = bucket, RegionID = m_host.ParentEntity.Scene.RegionInfo.RegionID }; if (m_TransferModule != null) m_TransferModule.SendInstantMessage(msg); }
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 = rules.GetLSLIntegerItem(i + 1); prules.BlendFuncSource = (byte)tmpi; } else if (rule == (int)ScriptBaseClass.PSYS_PART_BLEND_FUNC_DEST) { tmpi = 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 = tempf; } else if (rule == (int)ScriptBaseClass.PSYS_PART_END_GLOW) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.PartEndGlow = 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 llParticleSystem(LSL_List rules) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) return; SetParticleSystem(m_host, rules); }
public void llLinkParticleSystem(int linknumber, LSL_List rules) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) return; List<ISceneChildEntity> parts = GetLinkParts(linknumber); foreach (var part in parts) { SetParticleSystem(part, rules); } }
public LSL_List llGetAttachedList(string id) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) return new LSL_List(); IScenePresence av = World.GetScenePresence((UUID)id); if (av == null || av.IsDeleted) return new LSL_List("NOT FOUND"); if (av.IsChildAgent || av.IsInTransit) return new LSL_List("NOT ON REGION"); LSL_List AttachmentsList = new LSL_List(); IAttachmentsModule attachMod = World.RequestModuleInterface<IAttachmentsModule>(); if (attachMod != null) { ISceneEntity[] Attachments = attachMod.GetAttachmentsForAvatar(av.UUID); foreach (ISceneEntity Attachment in Attachments) { AttachmentsList.Add(new LSL_Key(Attachment.UUID.ToString())); } } return AttachmentsList; }
/// <summary> /// http://wiki.secondlife.com/wiki/LlGetAgentList /// The list of options is currently not used in SL /// scope is one of:- /// AGENT_LIST_REGION - all in the region /// AGENT_LIST_PARCEL - all in the same parcel as the scripted object /// AGENT_LIST_PARCEL_OWNER - all in any parcel owned by the owner of the /// current parcel. /// </summary> public LSL_List llGetAgentList(LSL_Integer scope, LSL_List options) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) return new LSL_List(); // the constants are 1, 2 and 4 so bits are being set, but you // get an error "INVALID_SCOPE" if it is anything but 1, 2 and 4 bool regionWide = scope == ScriptBaseClass.AGENT_LIST_REGION; bool parcelOwned = scope == ScriptBaseClass.AGENT_LIST_PARCEL_OWNER; bool parcel = scope == ScriptBaseClass.AGENT_LIST_PARCEL; LSL_List result = new LSL_List(); if (!regionWide && !parcelOwned && !parcel) { result.Add("INVALID_SCOPE"); return result; } Vector3 pos; UUID id = UUID.Zero; if (parcel || parcelOwned) { pos = m_host.GetWorldPosition(); IParcelManagementModule parcelManagement = World.RequestModuleInterface<IParcelManagementModule>(); ILandObject land = parcelManagement.GetLandObject(pos.X, pos.Y); if (land == null) { id = UUID.Zero; } else { if (parcelOwned) { id = land.LandData.OwnerID; } else { id = land.LandData.GlobalID; } } } World.ForEachScenePresence( delegate(IScenePresence ssp) { // Gods are not listed in SL if (!ssp.IsDeleted && FloatAlmostEqual(ssp.GodLevel, 0.0) && !ssp.IsChildAgent) { if (!regionWide) { pos = ssp.AbsolutePosition; IParcelManagementModule parcelManagement = World.RequestModuleInterface<IParcelManagementModule>(); ILandObject land = parcelManagement.GetLandObject(pos.X, pos.Y); if (land != null) { if (parcelOwned && land.LandData.OwnerID == id || parcel && land.LandData.GlobalID == id) { result.Add(ssp.UUID.ToString()); } } } else { result.Add(ssp.UUID.ToString()); } } // Maximum of 100 results if (result.Length > 99) { return; } } ); return result; }
/// <summary> /// Returns the index of the first occurrence of test /// in src. /// </summary> public LSL_Integer llListFindList(LSL_List src, LSL_List test) { int index = -1; int length = src.Length - test.Length + 1; if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) return 0; // If either list is empty, do not match if (src.Length != 0 && test.Length != 0) { for (int i = 0; i < length; i++) { if (src.Data[i].Equals(test.Data[0]) || test.Data[0].Equals(src.Data[i])) { int j; for (j = 1; j < test.Length; j++) if (!(src.Data[i + j].Equals(test.Data[j]) || test.Data[j].Equals(src.Data[i + j]))) break; if (j == test.Length) { index = i; break; } } } } return index; }
public LSL_List llGetPrimitiveParams(LSL_List rules) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) return new LSL_List(); return GetLinkPrimitiveParams(m_host, rules, m_allowOpenSimParams); }
public LSL_String llDumpList2String(LSL_List src, string seperator) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) return ""; if (src.Length == 0) { return string.Empty; } string ret = src.Data.Aggregate("", (current, o) => current + (o + seperator)); ret = ret.Substring(0, ret.Length - seperator.Length); return ret; }
public LSL_List GetLinkPrimitiveParams(ISceneChildEntity part, LSL_List rules, bool allowOpenSimParams) { LSL_List res = new LSL_List(); int idx = 0; while (idx < rules.Length) { int code = rules.GetLSLIntegerItem(idx++); int remain = rules.Length - idx; Primitive.TextureEntry tex = part.Shape.Textures; int face = 0; if (code == (int)ScriptBaseClass.PRIM_NAME) { res.Add(new LSL_String(part.Name)); } else if (code == (int)ScriptBaseClass.PRIM_DESC) { res.Add(new LSL_String(part.Description)); } else if (code == (int)ScriptBaseClass.PRIM_MATERIAL) { res.Add(new LSL_Integer(part.Material)); } else if (code == (int)ScriptBaseClass.PRIM_PHYSICS) { res.Add((part.GetEffectiveObjectFlags() & (uint)PrimFlags.Physics) != 0 ? new LSL_Integer(1) : new LSL_Integer(0)); } else if (code == (int)ScriptBaseClass.PRIM_TEMP_ON_REZ) { res.Add((part.GetEffectiveObjectFlags() & (uint)PrimFlags.TemporaryOnRez) != 0 ? new LSL_Integer(1) : new LSL_Integer(0)); } else if (code == (int)ScriptBaseClass.PRIM_PHANTOM) { res.Add((part.GetEffectiveObjectFlags() & (uint)PrimFlags.Phantom) != 0 ? new LSL_Integer(1) : new LSL_Integer(0)); } else if (code == (int)ScriptBaseClass.PRIM_POSITION) { Vector3 tmp = part.AbsolutePosition; LSL_Vector v = new LSL_Vector(tmp.X, tmp.Y, tmp.Z); // For some reason, the part.AbsolutePosition.* values do not change if the // linkset is rotated; they always reflect the child prim's world position // as though the linkset is unrotated. This is incompatible behavior with SL's // implementation, so will break scripts imported from there (not to mention it // makes it more difficult to determine a child prim's actual inworld position). if (part.ParentID != 0) { LSL_Rotation rtmp = llGetRootRotation(); LSL_Vector rpos = llGetRootPosition(); v = ((v - rpos) * rtmp) + rpos; } res.Add(v); } else if (code == (int)ScriptBaseClass.PRIM_POS_LOCAL) { res.Add(GetLocalPos(part)); } else if (code == (int)ScriptBaseClass.PRIM_SIZE) { Vector3 tmp = part.Scale; res.Add(new LSL_Vector(tmp.X, tmp.Y, tmp.Z)); } else if (code == (int)ScriptBaseClass.PRIM_ROTATION) { res.Add(GetPartRot(part)); } else if (code == (int)ScriptBaseClass.PRIM_TYPE) { // implementing box PrimitiveBaseShape Shape = part.Shape; int primType = (int)part.GetPrimType(); res.Add(new LSL_Integer(primType)); double topshearx = (sbyte)Shape.PathShearX / 100.0; // Fix negative values for PathShearX double topsheary = (sbyte)Shape.PathShearY / 100.0; // and PathShearY. if (primType == ScriptBaseClass.PRIM_TYPE_BOX || primType == ScriptBaseClass.PRIM_TYPE_CYLINDER || primType == ScriptBaseClass.PRIM_TYPE_PRISM) { res.Add(new LSL_Integer(Shape.ProfileCurve)); res.Add(new LSL_Vector(Shape.ProfileBegin / 50000.0, 1 - Shape.ProfileEnd / 50000.0, 0)); res.Add(new LSL_Float(Shape.ProfileHollow / 50000.0)); res.Add(new LSL_Vector(Shape.PathTwistBegin / 100.0, Shape.PathTwist / 100.0, 0)); res.Add(new LSL_Vector(1 - (Shape.PathScaleX / 100.0 - 1), 1 - (Shape.PathScaleY / 100.0 - 1), 0)); res.Add(new LSL_Vector(topshearx, topsheary, 0)); } if (primType == ScriptBaseClass.PRIM_TYPE_SPHERE) { res.Add(new LSL_Integer(Shape.ProfileCurve)); res.Add(new LSL_Vector(Shape.PathBegin / 50000.0, 1 - Shape.PathEnd / 50000.0, 0)); res.Add(new LSL_Float(Shape.ProfileHollow / 50000.0)); res.Add(new LSL_Vector(Shape.PathTwistBegin / 100.0, Shape.PathTwist / 100.0, 0)); res.Add(new LSL_Vector(Shape.ProfileBegin / 50000.0, 1 - Shape.ProfileEnd / 50000.0, 0)); } if (primType == ScriptBaseClass.PRIM_TYPE_SCULPT) { res.Add(Shape.SculptTexture.ToString()); res.Add(new LSL_Integer(Shape.SculptType)); } if (primType == ScriptBaseClass.PRIM_TYPE_RING || primType == ScriptBaseClass.PRIM_TYPE_TUBE || primType == ScriptBaseClass.PRIM_TYPE_TORUS) { // holeshape res.Add(new LSL_Integer(Shape.ProfileCurve)); // cut res.Add(new LSL_Vector(Shape.PathBegin / 50000.0, 1 - Shape.PathEnd / 50000.0, 0)); // hollow res.Add(new LSL_Float(Shape.ProfileHollow / 50000.0)); // twist res.Add(new LSL_Vector(Shape.PathTwistBegin / 100.0, Shape.PathTwist / 100.0, 0)); // vector holesize res.Add(new LSL_Vector(1 - (Shape.PathScaleX / 100.0 - 1), 1 - (Shape.PathScaleY / 100.0 - 1), 0)); // vector topshear res.Add(new LSL_Vector(topshearx, topsheary, 0)); // vector profilecut res.Add(new LSL_Vector(Shape.ProfileBegin / 50000.0, 1 - Shape.ProfileEnd / 50000.0, 0)); // vector tapera res.Add(new LSL_Vector(Shape.PathTaperX / 100.0, Shape.PathTaperY / 100.0, 0)); // float revolutions res.Add( new LSL_Float(Math.Round(Shape.PathRevolutions * 0.015d, 2, MidpointRounding.AwayFromZero)) + 1.0d); // Slightly inaccurate, because an unsigned byte is being used to represent // the entire range of floating-point values from 1.0 through 4.0 (which is how // SL does it). // // Using these formulas to store and retrieve PathRevolutions, it is not // possible to use all values between 1.00 and 4.00. For instance, you can't // represent 1.10. You can represent 1.09 and 1.11, but not 1.10. So, if you // use llSetPrimitiveParams to set revolutions to 1.10 and then retreive them // with llGetPrimitiveParams, you'll retrieve 1.09. You can also see a similar // behavior in the viewer as you cannot set 1.10. The viewer jumps to 1.11. // In SL, llSetPrimitveParams and llGetPrimitiveParams can set and get a value // such as 1.10. So, SL must store and retreive the actual user input rather // than only storing the encoded value. // float radiusoffset res.Add(new LSL_Float(Shape.PathRadiusOffset / 100.0)); // float skew res.Add(new LSL_Float(Shape.PathSkew / 100.0)); } } else if (code == (int)ScriptBaseClass.PRIM_TEXTURE) { if (remain < 1) return res; face = rules.GetLSLIntegerItem(idx++); if (face == ScriptBaseClass.ALL_SIDES) { for (face = 0; face < GetNumberOfSides(part); face++) { Primitive.TextureEntryFace texface = tex.GetFace((uint)face); res.Add(new LSL_String(texface.TextureID.ToString())); res.Add(new LSL_Vector(texface.RepeatU, texface.RepeatV, 0)); res.Add(new LSL_Vector(texface.OffsetU, texface.OffsetV, 0)); res.Add(new LSL_Float(texface.Rotation)); } } else { if (face >= 0 && face < GetNumberOfSides(part)) { Primitive.TextureEntryFace texface = tex.GetFace((uint)face); res.Add(new LSL_String(texface.TextureID.ToString())); res.Add(new LSL_Vector(texface.RepeatU, texface.RepeatV, 0)); res.Add(new LSL_Vector(texface.OffsetU, texface.OffsetV, 0)); res.Add(new LSL_Float(texface.Rotation)); } } } else if (code == (int)ScriptBaseClass.PRIM_COLOR) { if (remain < 1) return res; face = rules.GetLSLIntegerItem(idx++); tex = part.Shape.Textures; Color4 texcolor; if (face == ScriptBaseClass.ALL_SIDES) { for (face = 0; face < GetNumberOfSides(part); face++) { texcolor = tex.GetFace((uint)face).RGBA; res.Add(new LSL_Vector(texcolor.R, texcolor.G, texcolor.B)); res.Add(new LSL_Float(texcolor.A)); } } else { texcolor = tex.GetFace((uint)face).RGBA; res.Add(new LSL_Vector(texcolor.R, texcolor.G, texcolor.B)); res.Add(new LSL_Float(texcolor.A)); } } else if (code == (int)ScriptBaseClass.PRIM_BUMP_SHINY) { if (remain < 1) return res; face = rules.GetLSLIntegerItem(idx++); if (face == ScriptBaseClass.ALL_SIDES) { for (face = 0; face < GetNumberOfSides(part); face++) { Primitive.TextureEntryFace texface = tex.GetFace((uint)face); // Convert Shininess to PRIM_SHINY_* res.Add(new LSL_Integer((uint)texface.Shiny >> 6)); // PRIM_BUMP_* res.Add(new LSL_Integer((int)texface.Bump)); } } else { if (face >= 0 && face < GetNumberOfSides(part)) { Primitive.TextureEntryFace texface = tex.GetFace((uint)face); // Convert Shininess to PRIM_SHINY_* res.Add(new LSL_Integer((uint)texface.Shiny >> 6)); // PRIM_BUMP_* res.Add(new LSL_Integer((int)texface.Bump)); } } } else if (code == (int)ScriptBaseClass.PRIM_FULLBRIGHT) { if (remain < 1) return res; face = rules.GetLSLIntegerItem(idx++); tex = part.Shape.Textures; if (face == ScriptBaseClass.ALL_SIDES) { for (face = 0; face < GetNumberOfSides(part); face++) { Primitive.TextureEntryFace texface = tex.GetFace((uint)face); res.Add(new LSL_Integer(texface.Fullbright ? 1 : 0)); } } else { if (face >= 0 && face < GetNumberOfSides(part)) { Primitive.TextureEntryFace texface = tex.GetFace((uint)face); res.Add(new LSL_Integer(texface.Fullbright ? 1 : 0)); } } } else if (code == (int)ScriptBaseClass.PRIM_FLEXIBLE) { PrimitiveBaseShape shape = part.Shape; res.Add(shape.FlexiEntry ? new LSL_Integer(1) : new LSL_Integer(0)); res.Add(new LSL_Integer(shape.FlexiSoftness)); // softness res.Add(new LSL_Float(shape.FlexiGravity)); // gravity res.Add(new LSL_Float(shape.FlexiDrag)); // friction res.Add(new LSL_Float(shape.FlexiWind)); // wind res.Add(new LSL_Float(shape.FlexiTension)); // tension res.Add(new LSL_Vector(shape.FlexiForceX, // force shape.FlexiForceY, shape.FlexiForceZ)); } else if (code == (int)ScriptBaseClass.PRIM_TEXGEN) { if (remain < 1) return res; face = rules.GetLSLIntegerItem(idx++); if (face == ScriptBaseClass.ALL_SIDES) { for (face = 0; face < GetNumberOfSides(part); face++) { MappingType texgen = tex.GetFace((uint)face).TexMapType; // Convert MappingType to PRIM_TEXGEN_DEFAULT, PRIM_TEXGEN_PLANAR etc. res.Add(new LSL_Integer((uint)texgen >> 1)); } } else { if (face >= 0 && face < GetNumberOfSides(part)) { MappingType texgen = tex.GetFace((uint)face).TexMapType; res.Add(new LSL_Integer((uint)texgen >> 1)); } } } else if (code == (int)ScriptBaseClass.PRIM_POINT_LIGHT) { PrimitiveBaseShape shape = part.Shape; res.Add(shape.LightEntry ? new LSL_Integer(1) : new LSL_Integer(0)); res.Add(new LSL_Vector(shape.LightColorR, // color shape.LightColorG, shape.LightColorB)); res.Add(new LSL_Float(shape.LightIntensity)); // intensity res.Add(new LSL_Float(shape.LightRadius)); // radius res.Add(new LSL_Float(shape.LightFalloff)); // falloff } else if (code == (int)ScriptBaseClass.PRIM_GLOW) { if (remain < 1) return res; face = rules.GetLSLIntegerItem(idx++); if (face == ScriptBaseClass.ALL_SIDES) { for (face = 0; face < GetNumberOfSides(part); face++) { Primitive.TextureEntryFace texface = tex.GetFace((uint)face); res.Add(new LSL_Float(texface.Glow)); } } else { if (face >= 0 && face < GetNumberOfSides(part)) { Primitive.TextureEntryFace texface = tex.GetFace((uint)face); res.Add(new LSL_Float(texface.Glow)); } } } else if (code == (int)ScriptBaseClass.PRIM_TEXT) { Color4 textColor = part.GetTextColor(); res.Add(new LSL_String(part.Text)); res.Add(new LSL_Vector(textColor.R, textColor.G, textColor.B)); res.Add(new LSL_Float(1 - textColor.A)); } else if (code == (int)ScriptBaseClass.PRIM_ROT_LOCAL) { Quaternion rtmp = part.GetRotationOffset(); res.Add(new LSL_Rotation(rtmp.X, rtmp.Y, rtmp.Z, rtmp.W)); } else if (code == (int)ScriptBaseClass.PRIM_OMEGA) { Vector3 axis = part.OmegaAxis; LSL_Float spinRate = part.OmegaSpinRate; LSL_Float gain = part.OmegaGain; res.Add(axis); res.Add(spinRate); res.Add(gain); } else if (code == (int)ScriptBaseClass.PRIM_PHYSICS_SHAPE_TYPE) { res.Add(new LSL_Integer(part.PhysicsType)); } else if (code == (int)ScriptBaseClass.PRIM_LINK_TARGET) { if (remain < 1) continue; LSL_Integer nextLink = rules.GetLSLIntegerItem(idx++); List<ISceneChildEntity> entities = GetLinkParts(nextLink); if (entities.Count > 0) part = entities[0]; } else if (code == (int)ScriptBaseClass.OS_PRIM_PROJECTION) { if (!allowOpenSimParams) return null; res.Add((LSL_Integer)( part.Shape.ProjectionEntry ? 1 : 0)); res.Add((LSL_Key)part.Shape.ProjectionTextureUUID.ToString()); res.Add((LSL_Float)part.Shape.ProjectionFOV); res.Add((LSL_Float)part.Shape.ProjectionFocus); res.Add((LSL_Float)part.Shape.ProjectionAmbiance); } else if (code == (int)ScriptBaseClass.OS_PRIM_VELOCITY) { if (!allowOpenSimParams) return null; res.Add(new LSL_Vector(part.Velocity)); } else if (code == (int)ScriptBaseClass.OS_PRIM_ACCELERATION) { if (!allowOpenSimParams) return null; res.Add(new LSL_Vector(part.Acceleration)); } } return res; }
public DateTime llDialog(string avatar, string message, LSL_List buttons, int chat_channel) { IDialogModule dm = World.RequestModuleInterface<IDialogModule>(); if (dm == null) return DateTime.Now; if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) return DateTime.Now; UUID av = new UUID(); if (!UUID.TryParse(avatar, out av)) { //Silently accepted in in SL NOTE: it does sleep though! //LSLError("First parameter to llDialog needs to be a key"); return PScriptSleep(m_sleepMsOnDialog); } if (buttons.Length > 12) { Error("llDialog", "No more than 12 buttons can be shown"); return DateTime.Now; } string[] buts = new string[buttons.Length]; for (int i = 0; i < buttons.Length; i++) { if (buttons.Data[i].ToString() == string.Empty) { Error("llDialog", "Button label cannot be blank"); return DateTime.Now; } if (buttons.Data[i].ToString().Length > 24) { Error("llDialog", "Button label cannot be longer than 24 characters"); return DateTime.Now; } buts[i] = buttons.Data[i].ToString(); } if (buts.Length == 0) buts = new[] { "OK" }; dm.SendDialogToUser( av, m_host.Name, m_host.UUID, m_host.OwnerID, message, new UUID("00000000-0000-2222-3333-100000001000"), chat_channel, buts); return PScriptSleep(m_sleepMsOnDialog); }
private void ConvertWindlightDayCycle(WindlightDayCycle cycle, int preset, int rule, ref LSL_List list) { var skyDatas = cycle.Cycle.DataSettings.Values.ToList(); var skyData = skyDatas[preset]; switch (rule) { case (int) ScriptBaseClass.WL_AMBIENT: list.Add(new LSL_Rotation(skyData.ambient.X, skyData.ambient.Y, skyData.ambient.Z, skyData.ambient.W)); break; case (int) ScriptBaseClass.WL_SKY_BLUE_DENSITY: list.Add(new LSL_Rotation(skyData.blue_density.X, skyData.blue_density.Y, skyData.blue_density.Z, skyData.blue_density.W)); break; case (int) ScriptBaseClass.WL_SKY_BLUR_HORIZON: list.Add(new LSL_Rotation(skyData.blue_horizon.X, skyData.blue_horizon.Y, skyData.blue_horizon.Z, skyData.blue_horizon.W)); break; case (int) ScriptBaseClass.WL_CLOUD_COLOR: list.Add(new LSL_Rotation(skyData.cloud_color.X, skyData.cloud_color.Y, skyData.cloud_color.Z, skyData.cloud_color.W)); break; case (int) ScriptBaseClass.WL_CLOUD_POS_DENSITY1: list.Add(new LSL_Rotation(skyData.cloud_pos_density1.X, skyData.cloud_pos_density1.Y, skyData.cloud_pos_density1.Z, skyData.cloud_pos_density1.W)); break; case (int) ScriptBaseClass.WL_CLOUD_POS_DENSITY2: list.Add(new LSL_Rotation(skyData.cloud_pos_density2.X, skyData.cloud_pos_density2.Y, skyData.cloud_pos_density2.Z, skyData.cloud_pos_density2.W)); break; case (int) ScriptBaseClass.WL_CLOUD_SCALE: list.Add(new LSL_Rotation(skyData.cloud_scale.X, skyData.cloud_scale.Y, skyData.cloud_scale.Z, skyData.cloud_scale.W)); break; case (int) ScriptBaseClass.WL_CLOUD_SCROLL_X: list.Add(new LSL_Float(skyData.cloud_scroll_rate.X)); break; case (int) ScriptBaseClass.WL_CLOUD_SCROLL_X_LOCK: list.Add(new LSL_Integer(skyData.enable_cloud_scroll.X)); break; case (int) ScriptBaseClass.WL_CLOUD_SCROLL_Y: list.Add(new LSL_Float(skyData.cloud_scroll_rate.Y)); break; case (int) ScriptBaseClass.WL_CLOUD_SCROLL_Y_LOCK: list.Add(new LSL_Integer(skyData.enable_cloud_scroll.Y)); break; case (int) ScriptBaseClass.WL_CLOUD_SHADOW: list.Add(new LSL_Rotation(skyData.cloud_shadow.X, skyData.cloud_shadow.Y, skyData.cloud_shadow.Z, skyData.cloud_shadow.W)); break; case (int) ScriptBaseClass.WL_SKY_DENSITY_MULTIPLIER: list.Add(new LSL_Rotation(skyData.density_multiplier.X, skyData.density_multiplier.Y, skyData.density_multiplier.Z, skyData.density_multiplier.W)); break; case (int) ScriptBaseClass.WL_SKY_DISTANCE_MULTIPLIER: list.Add(new LSL_Rotation(skyData.distance_multiplier.X, skyData.distance_multiplier.Y, skyData.distance_multiplier.Z, skyData.distance_multiplier.W)); break; case (int) ScriptBaseClass.WL_SKY_GAMMA: list.Add(new LSL_Rotation(skyData.gamma.X, skyData.gamma.Y, skyData.gamma.Z, skyData.gamma.W)); break; case (int) ScriptBaseClass.WL_SKY_GLOW: list.Add(new LSL_Rotation(skyData.glow.X, skyData.glow.Y, skyData.glow.Z, skyData.glow.W)); break; case (int) ScriptBaseClass.WL_SKY_HAZE_DENSITY: list.Add(new LSL_Rotation(skyData.haze_density.X, skyData.haze_density.Y, skyData.haze_density.Z, skyData.haze_density.W)); break; case (int) ScriptBaseClass.WL_SKY_HAZE_HORIZON: list.Add(new LSL_Rotation(skyData.haze_horizon.X, skyData.haze_horizon.Y, skyData.haze_horizon.Z, skyData.haze_horizon.W)); break; case (int) ScriptBaseClass.WL_SKY_LIGHT_NORMALS: list.Add(new LSL_Rotation(skyData.lightnorm.X, skyData.lightnorm.Y, skyData.lightnorm.Z, skyData.lightnorm.W)); break; case (int) ScriptBaseClass.WL_SKY_MAX_ALTITUDE: list.Add(new LSL_Rotation(skyData.max_y.X, skyData.max_y.Y, skyData.max_y.Z, skyData.max_y.W)); break; case (int) ScriptBaseClass.WL_SKY_STAR_BRIGHTNESS: list.Add(new LSL_Float(skyData.star_brightness)); break; case (int) ScriptBaseClass.WL_SKY_SUNLIGHT_COLOR: list.Add(new LSL_Rotation(skyData.sunlight_color.X, skyData.sunlight_color.Y, skyData.sunlight_color.Z, skyData.sunlight_color.W)); break; case (int) ScriptBaseClass.WL_WATER_BLUR_MULTIPLIER: list.Add(new LSL_Float(cycle.Water.blurMultiplier)); break; case (int) ScriptBaseClass.WL_WATER_FRESNEL_OFFSET: list.Add(new LSL_Float(cycle.Water.fresnelOffset)); break; case (int) ScriptBaseClass.WL_WATER_FRESNEL_SCALE: list.Add(new LSL_Float(cycle.Water.fresnelScale)); break; case (int) ScriptBaseClass.WL_WATER_NORMAL_MAP: list.Add(new LSL_String(cycle.Water.normalMap)); break; case (int) ScriptBaseClass.WL_WATER_NORMAL_SCALE: list.Add(new LSL_Vector(cycle.Water.normScale.X, cycle.Water.normScale.Y, cycle.Water.normScale.Z)); break; case (int) ScriptBaseClass.WL_WATER_SCALE_ABOVE: list.Add(new LSL_Float(cycle.Water.scaleAbove)); break; case (int) ScriptBaseClass.WL_WATER_SCALE_BELOW: list.Add(new LSL_Float(cycle.Water.scaleBelow)); break; case (int) ScriptBaseClass.WL_WATER_UNDERWATER_FOG_MODIFIER: list.Add(new LSL_Float(cycle.Water.underWaterFogMod)); break; case (int) ScriptBaseClass.WL_WATER_FOG_COLOR: list.Add(new LSL_Rotation(cycle.Water.waterFogColor.X, cycle.Water.waterFogColor.Y, cycle.Water.waterFogColor.Z, cycle.Water.waterFogColor.W)); break; case (int) ScriptBaseClass.WL_WATER_FOG_DENSITY: list.Add(new LSL_Float(cycle.Water.waterFogDensity)); break; case (int) ScriptBaseClass.WL_WATER_BIG_WAVE_DIRECTION: list.Add(new LSL_Vector(cycle.Water.wave1Dir.X, cycle.Water.wave1Dir.Y, 0.0f)); break; case (int) ScriptBaseClass.WL_WATER_LITTLE_WAVE_DIRECTION: list.Add(new LSL_Vector(cycle.Water.wave2Dir.X, cycle.Water.wave2Dir.Y, 0.0f)); break; } }
public void llSetPrimitiveParams(LSL_List rules) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) return; SetPrimParams(m_host, rules, m_allowOpenSimParams); PScriptSleep(m_sleepMsOnSetPrimitiveParams); }
public LSL_List aaGetTeamMembers(LSL_String team) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.Low, "aaGetTeamMembers", m_host, "AA", m_itemID)) return new LSL_List(); List<UUID> Members = new List<UUID>(); ICombatModule module = World.RequestModuleInterface<ICombatModule>(); if (module != null) { Members = module.GetTeammates(team); } LSL_List members = new LSL_List(); foreach (UUID member in Members) members.Add(new LSL_Key(member.ToString())); return members; }
public void llSetLinkPrimitiveParams(int linknumber, LSL_List rules) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) return; List<IEntity> parts = GetLinkPartsAndEntities(linknumber); foreach (IEntity part in parts) SetPrimParams(part, rules, m_allowOpenSimParams); PScriptSleep(m_sleepMsOnSetLinkPrimitiveParams); }
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); }
public void llSetLinkPrimitiveParamsFast(int linknumber, LSL_List rules) { List<ISceneChildEntity> parts = GetLinkParts(linknumber); foreach (ISceneChildEntity part in parts) SetPrimParams(part, rules, m_allowOpenSimParams); }
public LSL_List aaWindlightGetDayCycle() { IEnvironmentSettingsModule environmentSettings = World.RequestModuleInterface<IEnvironmentSettingsModule>(); if (environmentSettings == null) return new LSL_List(new object[2] {ScriptBaseClass.WL_ERROR, ScriptBaseClass.WL_ERROR_NO_SCENE_SET}); WindlightDayCycle cycle = environmentSettings.GetCurrentDayCycle(); if (cycle == null) return new LSL_List(new object[2] {ScriptBaseClass.WL_ERROR, ScriptBaseClass.WL_ERROR_NO_SCENE_SET}); if (cycle.Cycle.IsStaticDayCycle) return new LSL_List(new object[3] {0, -1, cycle.Cycle.DataSettings["-1"].preset_name}); LSL_List list = new LSL_List(); int i = 0; foreach (var key in cycle.Cycle.DataSettings) { list.Add(i++); list.Add(key.Key); list.Add(key.Value.preset_name); } return list; }
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 aaWindlightSetScene(int dayCycleIndex, LSL_List list) { IEnvironmentSettingsModule environmentSettings = World.RequestModuleInterface<IEnvironmentSettingsModule>(); if (environmentSettings == null) return ScriptBaseClass.WL_ERROR_NO_SCENE_SET; WindlightDayCycle cycle = environmentSettings.GetCurrentDayCycle(); if (cycle == null) return ScriptBaseClass.WL_ERROR_NO_SCENE_SET; if (!cycle.Cycle.IsStaticDayCycle) return ScriptBaseClass.WL_ERROR_SCENE_MUST_BE_STATIC; if (dayCycleIndex >= cycle.Cycle.DataSettings.Count) return ScriptBaseClass.WL_ERROR_BAD_SETTING; ConvertLSLToWindlight(ref cycle, dayCycleIndex, list); environmentSettings.SetDayCycle(cycle); environmentSettings.TriggerWindlightUpdate(1); return ScriptBaseClass.WL_OK; }
public LSL_List llGetAnimationList(string id) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) return new LSL_List(); LSL_List l = new LSL_List(); IScenePresence av = World.GetScenePresence((UUID)id); if (av == null || av.IsChildAgent) // only if in the region return l; UUID[] anims = av.Animator.GetAnimationArray(); foreach (UUID foo in anims) l.Add(new LSL_Key(foo.ToString())); return l; }
public void botSetMap(string keyOfBot, LSL_List positions, LSL_List movementType, LSL_Integer flags) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.Moderate, "botSetMap", m_host, "bot", m_itemID)) return; List<Vector3> PositionsMap = new List<Vector3>(); for (int i = 0; i < positions.Length; i++) { LSL_Vector pos = positions.GetVector3Item(i); PositionsMap.Add(new Vector3((float) pos.x, (float) pos.y, (float) pos.z)); } List<TravelMode> TravelMap = new List<TravelMode>(); for (int i = 0; i < movementType.Length; i++) { LSL_Integer travel = movementType.GetLSLIntegerItem(i); TravelMap.Add((TravelMode) travel.value); } IBotManager manager = World.RequestModuleInterface<IBotManager>(); if (manager != null) manager.SetBotMap(UUID.Parse(keyOfBot), PositionsMap, TravelMap, flags.value, m_host.OwnerID); }
/// <summary> /// A partial implementation. /// http://lslwiki.net/lslwiki/wakka.php?wakka=llGetBoundingBox /// So far only valid for standing/flying/ground sitting avatars and single prim objects. /// If the object has multiple prims and/or a sitting avatar then the bounding /// box is for the root prim only. /// </summary> public LSL_List llGetBoundingBox(string obj) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) return new LSL_List(); UUID objID = UUID.Zero; LSL_List result = new LSL_List(); if (!UUID.TryParse(obj, out objID)) { result.Add(new LSL_Vector()); result.Add(new LSL_Vector()); return result; } IScenePresence presence = World.GetScenePresence(objID); if (presence != null) { if (presence.ParentID == UUID.Zero) // not sat on an object { LSL_Vector lower = new LSL_Vector(); LSL_Vector upper = new LSL_Vector(); if (presence.Animator.Animations.ImplicitDefaultAnimation.AnimID == AnimationSet.Animations.AnimsUUID["SIT_GROUND_CONSTRAINED"]) { // This is for ground sitting avatars IAvatarAppearanceModule appearance = presence.RequestModuleInterface<IAvatarAppearanceModule>(); if (appearance != null) { float height = appearance.Appearance.AvatarHeight / 2.66666667f; lower = new LSL_Vector(-0.3375f, -0.45f, height * -1.0f); upper = new LSL_Vector(0.3375f, 0.45f, 0.0f); } } else { // This is for standing/flying avatars IAvatarAppearanceModule appearance = presence.RequestModuleInterface<IAvatarAppearanceModule>(); if (appearance != null) { float height = appearance.Appearance.AvatarHeight / 2.0f; lower = new LSL_Vector(-0.225f, -0.3f, height * -1.0f); upper = new LSL_Vector(0.225f, 0.3f, height + 0.05f); } } result.Add(lower); result.Add(upper); return result; } // sitting on an object so we need the bounding box of that // which should include the avatar so set the UUID to the // UUID of the object the avatar is sat on and allow it to fall through // to processing an object ISceneChildEntity p = World.GetSceneObjectPart(presence.ParentID); objID = p.UUID; } ISceneChildEntity part = World.GetSceneObjectPart(objID); // Currently only works for single prims without a sitting avatar if (part != null) { Vector3 halfSize = part.Scale * 0.5f; LSL_Vector lower = new LSL_Vector(halfSize.X * -1.0f, halfSize.Y * -1.0f, halfSize.Z * -1.0f); LSL_Vector upper = new LSL_Vector(halfSize.X, halfSize.Y, halfSize.Z); result.Add(lower); result.Add(upper); return result; } // Not found so return empty values result.Add(new LSL_Vector()); result.Add(new LSL_Vector()); return result; }