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 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); } }
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 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 void llSetKeyframedMotion(LSL_List keyframes, LSL_List options) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) return; if (!m_host.IsRoot) { ShoutError("Must be used in the root object!"); return; } KeyframeAnimation.Data dataType = KeyframeAnimation.Data.Both; KeyframeAnimation.Modes currentMode = KeyframeAnimation.Modes.Forward; for (int i = 0; i < options.Length; i += 2) { LSL_Integer option = options.GetLSLIntegerItem(i); LSL_Integer value = options.GetLSLIntegerItem(i + 1); if (option == ScriptBaseClass.KFM_COMMAND) { m_host.ParentEntity.AddKeyframedMotion(null, (KeyframeAnimation.Commands) value.value); break; //Its supposed to be the only option in the list } if (option == ScriptBaseClass.KFM_MODE) { currentMode = (KeyframeAnimation.Modes) value.value; } else if (option == ScriptBaseClass.KFM_DATA) { dataType = (KeyframeAnimation.Data) value.value; } } List<Vector3> positions = new List<Vector3>(); List<Quaternion> rotations = new List<Quaternion>(); List<float> times = new List<float>(); for (int i = 0; i < keyframes.Length; i += (dataType == KeyframeAnimation.Data.Both ? 3 : 2)) { if (dataType == KeyframeAnimation.Data.Both || dataType == KeyframeAnimation.Data.Translation) { LSL_Vector pos = keyframes.GetVector3Item(i); positions.Add(pos.ToVector3()); } if (dataType == KeyframeAnimation.Data.Both || dataType == KeyframeAnimation.Data.Rotation) { LSL_Rotation rot = keyframes.GetQuaternionItem(i + (dataType == KeyframeAnimation.Data.Both ? 1 : 0)); Quaternion quat = rot.ToQuaternion(); quat.Normalize(); rotations.Add(quat); } LSL_Float time = keyframes.GetLSLFloatItem(i + (dataType == KeyframeAnimation.Data.Both ? 2 : 1)); times.Add((float)time); } KeyframeAnimation animation = new KeyframeAnimation { CurrentMode = currentMode, PositionList = positions.ToArray(), RotationList = rotations.ToArray(), TimeList = times.ToArray(), CurrentAnimationPosition = 0, InitialPosition = m_host.AbsolutePosition, InitialRotation = m_host.GetRotationOffset() }; m_host.ParentEntity.AddKeyframedMotion(animation, KeyframeAnimation.Commands.Play); }
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 void llNavigateTo(LSL_Vector point, LSL_List options) { List<Vector3> positions = new List<Vector3>() {point.ToVector3()}; List<TravelMode> travelMode = new List<TravelMode>() {TravelMode.Walk}; IBotManager botManager = World.RequestModuleInterface<IBotManager>(); int flags = 0; if (options.Length > 0) flags |= options.GetLSLIntegerItem(0); if (botManager != null) botManager.SetBotMap(m_host.ParentEntity.UUID, positions, travelMode, flags, m_host.ParentEntity.OwnerID); }
public void llPursue(LSL_String target, LSL_List options) { IBotManager botManager = World.RequestModuleInterface<IBotManager>(); if (botManager != null) { float fuzz = 2; Vector3 offset = Vector3.Zero; bool requireLOS = false; // 20131224 not used bool intercept; = false; //Not implemented for (int i = 0; i < options.Length; i += 2) { LSL_Types.LSLInteger opt = options.GetLSLIntegerItem(i); if (opt == ScriptBaseClass.PURSUIT_FUZZ_FACTOR) fuzz = (float) options.GetLSLFloatItem(i + 1).value; if (opt == ScriptBaseClass.PURSUIT_OFFSET) offset = options.GetVector3Item(i + 1).ToVector3(); if (opt == ScriptBaseClass.REQUIRE_LINE_OF_SIGHT) requireLOS = options.GetLSLIntegerItem(i + 1) == 1; // 20131224 not used if (opt == ScriptBaseClass.PURSUIT_INTERCEPT) // 20131224 not used intercept = options.GetLSLIntegerItem(i + 1) == 1; } botManager.FollowAvatar(m_host.ParentEntity.UUID, target.m_string, fuzz, fuzz, requireLOS, offset, m_host.ParentEntity.OwnerID); } }
public LSL_List llCastRay(LSL_Vector start, LSL_Vector end, LSL_List options) { if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) return new LSL_List(); LSL_List list = new LSL_List(); Vector3 rayStart = start.ToVector3(); Vector3 rayEnd = end.ToVector3(); Vector3 dir = rayEnd - rayStart; float dist = Vector3.Mag(dir); int count = 1; bool detectPhantom = false; int dataFlags = 0; int rejectTypes = 0; for (int i = 0; i < options.Length; i += 2) { if (options.GetLSLIntegerItem(i) == ScriptBaseClass.RC_MAX_HITS) count = options.GetLSLIntegerItem(i + 1); else if (options.GetLSLIntegerItem(i) == ScriptBaseClass.RC_DETECT_PHANTOM) detectPhantom = (options.GetLSLIntegerItem(i + 1) > 0); else if (options.GetLSLIntegerItem(i) == ScriptBaseClass.RC_DATA_FLAGS) dataFlags = options.GetLSLIntegerItem(i + 1); else if (options.GetLSLIntegerItem(i) == ScriptBaseClass.RC_REJECT_TYPES) rejectTypes = options.GetLSLIntegerItem(i + 1); } if (count > 16) count = 16; else if (count <= 0) { LSLError("You must request at least one result from llCastRay."); return new LSL_List(); } List<ContactResult> results = new List<ContactResult>(); bool checkTerrain = !((rejectTypes & ScriptBaseClass.RC_REJECT_LAND) == ScriptBaseClass.RC_REJECT_LAND); bool checkAgents = !((rejectTypes & ScriptBaseClass.RC_REJECT_AGENTS) == ScriptBaseClass.RC_REJECT_AGENTS); bool checkNonPhysical = !((rejectTypes & ScriptBaseClass.RC_REJECT_NONPHYSICAL) == ScriptBaseClass.RC_REJECT_NONPHYSICAL); bool checkPhysical = !((rejectTypes & ScriptBaseClass.RC_REJECT_PHYSICAL) == ScriptBaseClass.RC_REJECT_PHYSICAL); if (checkAgents) { ContactResult[] agentHits = AvatarIntersection(rayStart, rayEnd); foreach (ContactResult r in agentHits) results.Add(r); } if (checkPhysical || checkNonPhysical || detectPhantom) { ContactResult[] objectHits = ObjectIntersection(rayStart, rayEnd, checkPhysical, checkNonPhysical, detectPhantom, count+2); for (int iter = 0; iter < objectHits.Length; iter++) { // Redistance the Depth because the Scene RayCaster returns distance from center to make the rezzing code simpler. objectHits[iter].Depth = Vector3.Distance(objectHits[iter].Pos, rayStart); results.Add(objectHits[iter]); } } if (checkTerrain) { ContactResult? groundContact = GroundIntersection(rayStart, rayEnd); if (groundContact != null) results.Add((ContactResult)groundContact); } results.Sort(delegate(ContactResult a, ContactResult b) { return a.Depth.CompareTo(b.Depth); }); int values = 0; ISceneEntity thisgrp = m_host.ParentEntity; foreach (ContactResult result in results) { if (result.Depth > dist) continue; // physics ray can return colisions with host prim // this is supposed to happen if (m_host.LocalId == result.ConsumerID) continue; if (!checkTerrain && result.ConsumerID == 0) continue; //Terrain UUID itemID = UUID.Zero; int linkNum = 0; ISceneChildEntity part = World.GetSceneObjectPart(result.ConsumerID); // It's a prim! if (part != null) { // dont detect members of same object ??? if (part.ParentEntity == thisgrp) continue; if ((dataFlags & ScriptBaseClass.RC_GET_ROOT_KEY) == ScriptBaseClass.RC_GET_ROOT_KEY) itemID = part.ParentEntity.UUID; else itemID = part.UUID; linkNum = part.LinkNum; } else { IScenePresence sp = World.GetScenePresence(result.ConsumerID); /// It it a boy? a girl? if (sp != null) itemID = sp.UUID; } list.Add(new LSL_String(itemID.ToString())); if ((dataFlags & ScriptBaseClass.RC_GET_LINK_NUM) == ScriptBaseClass.RC_GET_LINK_NUM) list.Add(new LSL_Integer(linkNum)); list.Add(new LSL_Vector(result.Pos)); if ((dataFlags & ScriptBaseClass.RC_GET_NORMAL) == ScriptBaseClass.RC_GET_NORMAL) { Vector3 norm = result.Normal * -1; list.Add(new LSL_Vector(norm)); } values++; if (values >= count) break; } list.Add(new LSL_Integer(values)); return list; }
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(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; }
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(); 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 { float tempf = 0; 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) { int 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_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); }
private LSL_List GetPrimMediaParams(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); // As per http://wiki.secondlife.com/wiki/LlGetPrimMediaParams if (null == me) return new LSL_List(); LSL_List res = new LSL_List(); for (int i = 0; i < rules.Length; i++) { int code = (int) rules.GetLSLIntegerItem(i); if (code == ScriptBaseClass.PRIM_MEDIA_ALT_IMAGE_ENABLE) { // Not implemented res.Add(new LSL_Integer(0)); } else if (code == ScriptBaseClass.PRIM_MEDIA_CONTROLS) { res.Add(me.Controls == MediaControls.Standard ? new LSL_Integer(ScriptBaseClass.PRIM_MEDIA_CONTROLS_STANDARD) : new LSL_Integer(ScriptBaseClass.PRIM_MEDIA_CONTROLS_MINI)); } else if (code == ScriptBaseClass.PRIM_MEDIA_CURRENT_URL) { res.Add(new LSL_String(me.CurrentURL)); } else if (code == ScriptBaseClass.PRIM_MEDIA_HOME_URL) { res.Add(new LSL_String(me.HomeURL)); } else if (code == ScriptBaseClass.PRIM_MEDIA_AUTO_LOOP) { res.Add(me.AutoLoop ? ScriptBaseClass.TRUE : ScriptBaseClass.FALSE); } else if (code == ScriptBaseClass.PRIM_MEDIA_AUTO_PLAY) { res.Add(me.AutoPlay ? ScriptBaseClass.TRUE : ScriptBaseClass.FALSE); } else if (code == ScriptBaseClass.PRIM_MEDIA_AUTO_SCALE) { res.Add(me.AutoScale ? ScriptBaseClass.TRUE : ScriptBaseClass.FALSE); } else if (code == ScriptBaseClass.PRIM_MEDIA_AUTO_ZOOM) { res.Add(me.AutoZoom ? ScriptBaseClass.TRUE : ScriptBaseClass.FALSE); } else if (code == ScriptBaseClass.PRIM_MEDIA_FIRST_CLICK_INTERACT) { res.Add(me.InteractOnFirstClick ? ScriptBaseClass.TRUE : ScriptBaseClass.FALSE); } else if (code == ScriptBaseClass.PRIM_MEDIA_WIDTH_PIXELS) { res.Add(new LSL_Integer(me.Width)); } else if (code == ScriptBaseClass.PRIM_MEDIA_HEIGHT_PIXELS) { res.Add(new LSL_Integer(me.Height)); } else if (code == ScriptBaseClass.PRIM_MEDIA_WHITELIST_ENABLE) { res.Add(me.EnableWhiteList ? ScriptBaseClass.TRUE : ScriptBaseClass.FALSE); } else if (code == ScriptBaseClass.PRIM_MEDIA_WHITELIST) { string[] urls = (string[]) me.WhiteList.Clone(); for (int j = 0; j < urls.Length; j++) urls[j] = Uri.EscapeDataString(urls[j]); res.Add(new LSL_String(string.Join(", ", urls))); } else if (code == ScriptBaseClass.PRIM_MEDIA_PERMS_INTERACT) { res.Add(new LSL_Integer((int) me.InteractPermissions)); } else if (code == ScriptBaseClass.PRIM_MEDIA_PERMS_CONTROL) { res.Add(new LSL_Integer((int) me.ControlPermissions)); } } return res; }
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); 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.LSL_STATUS_OK; }
public void llUpdateCharacter(LSL_List options) { IBotManager botManager = World.RequestModuleInterface<IBotManager>(); if (botManager != null) { IBotController controller = botManager.GetCharacterManager(m_host.ParentEntity.UUID); for (int i = 0; i < options.Length; i += 2) { LSL_Types.LSLInteger opt = options.GetLSLIntegerItem(i); LSL_Types.LSLFloat value = options.GetLSLFloatItem(i + 1); if (opt == ScriptBaseClass.CHARACTER_DESIRED_SPEED) controller.SetSpeedModifier((float) value.value); else if (opt == ScriptBaseClass.CHARACTER_RADIUS) { } else if (opt == ScriptBaseClass.CHARACTER_LENGTH) { } else if (opt == ScriptBaseClass.CHARACTER_ORIENTATION) { } else if (opt == ScriptBaseClass.TRAVERSAL_TYPE) { } else if (opt == ScriptBaseClass.CHARACTER_TYPE) { } else if (opt == ScriptBaseClass.CHARACTER_AVOIDANCE_MODE) { } else if (opt == ScriptBaseClass.CHARACTER_MAX_ACCEL) { } else if (opt == ScriptBaseClass.CHARACTER_MAX_DECEL) { } else if (opt == ScriptBaseClass.CHARACTER_MAX_ANGULAR_SPEED) { } else if (opt == ScriptBaseClass.CHARACTER_MAX_ANGULAR_ACCEL) { } else if (opt == ScriptBaseClass.CHARACTER_TURN_SPEED_MULTIPLIER) { } } } }