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; 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; if (opt == ScriptBaseClass.PURSUIT_INTERCEPT) intercept = options.GetLSLIntegerItem(i + 1) == 1; } botManager.FollowAvatar(m_host.ParentEntity.UUID, target.m_string, fuzz, fuzz, requireLOS, offset, m_host.ParentEntity.OwnerID); } }
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); }
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); }
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 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 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(); } }
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; } } } }