private void SetTextureAnim(SceneObjectPart part, int mode, int face, int sizex, int sizey, double start, double length, double rate) { Primitive.TextureAnimation pTexAnim = new Primitive.TextureAnimation(); pTexAnim.Flags = (Primitive.TextureAnimMode)mode; //ALL_SIDES if (face == ScriptBaseClass.ALL_SIDES) face = 255; pTexAnim.Face = (uint)face; pTexAnim.Length = (float)length; pTexAnim.Rate = (float)rate; pTexAnim.SizeX = (uint)sizex; pTexAnim.SizeY = (uint)sizey; pTexAnim.Start = (float)start; part.AddTextureAnimation(pTexAnim); part.SendFullUpdateToAllClients(); part.ParentGroup.HasGroupChanged = true; }
private void SetParticleSystem(SceneObjectPart part, LSL_List rules) { if (rules.Length == 0) { part.RemoveParticleSystem(); part.ParentGroup.HasGroupChanged = true; } else { Primitive.ParticleSystem prules = getNewParticleSystemWithSLDefaultValues(); LSL_Vector tempv = new LSL_Vector(); float tempf = 0; for (int i = 0; i < rules.Length; i += 2) { switch (rules.GetLSLIntegerItem(i)) { case (int)ScriptBaseClass.PSYS_PART_FLAGS: prules.PartDataFlags = (Primitive.ParticleSystem.ParticleDataFlags)(uint)rules.GetLSLIntegerItem(i + 1); break; case (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; break; case (int)ScriptBaseClass.PSYS_PART_START_ALPHA: tempf = (float)rules.GetLSLFloatItem(i + 1); prules.PartStartColor.A = tempf; break; case (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; break; case (int)ScriptBaseClass.PSYS_PART_END_ALPHA: tempf = (float)rules.GetLSLFloatItem(i + 1); prules.PartEndColor.A = tempf; break; case (int)ScriptBaseClass.PSYS_PART_START_SCALE: tempv = rules.GetVector3Item(i + 1); prules.PartStartScaleX = (float)tempv.x; prules.PartStartScaleY = (float)tempv.y; break; case (int)ScriptBaseClass.PSYS_PART_END_SCALE: tempv = rules.GetVector3Item(i + 1); prules.PartEndScaleX = (float)tempv.x; prules.PartEndScaleY = (float)tempv.y; break; case (int)ScriptBaseClass.PSYS_PART_MAX_AGE: tempf = (float)rules.GetLSLFloatItem(i + 1); prules.PartMaxAge = tempf; break; case (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; break; case (int)ScriptBaseClass.PSYS_SRC_PATTERN: int tmpi = (int)rules.GetLSLIntegerItem(i + 1); prules.Pattern = (Primitive.ParticleSystem.SourcePattern)tmpi; break; // 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. case (int)ScriptBaseClass.PSYS_SRC_INNERANGLE: tempf = (float)rules.GetLSLFloatItem(i + 1); prules.InnerAngle = (float)tempf; prules.PartFlags &= 0xFFFFFFFD; // Make sure new angle format is off. break; case (int)ScriptBaseClass.PSYS_SRC_OUTERANGLE: tempf = (float)rules.GetLSLFloatItem(i + 1); prules.OuterAngle = (float)tempf; prules.PartFlags &= 0xFFFFFFFD; // Make sure new angle format is off. break; case (int)ScriptBaseClass.PSYS_SRC_TEXTURE: prules.Texture = KeyOrName(rules.GetLSLStringItem(i + 1)); break; case (int)ScriptBaseClass.PSYS_SRC_BURST_RATE: tempf = (float)rules.GetLSLFloatItem(i + 1); prules.BurstRate = (float)tempf; break; case (int)ScriptBaseClass.PSYS_SRC_BURST_PART_COUNT: prules.BurstPartCount = (byte)(int)rules.GetLSLIntegerItem(i + 1); break; case (int)ScriptBaseClass.PSYS_SRC_BURST_RADIUS: tempf = (float)rules.GetLSLFloatItem(i + 1); prules.BurstRadius = (float)tempf; break; case (int)ScriptBaseClass.PSYS_SRC_BURST_SPEED_MIN: tempf = (float)rules.GetLSLFloatItem(i + 1); prules.BurstSpeedMin = (float)tempf; break; case (int)ScriptBaseClass.PSYS_SRC_BURST_SPEED_MAX: tempf = (float)rules.GetLSLFloatItem(i + 1); prules.BurstSpeedMax = (float)tempf; break; case (int)ScriptBaseClass.PSYS_SRC_MAX_AGE: tempf = (float)rules.GetLSLFloatItem(i + 1); prules.MaxAge = (float)tempf; break; case (int)ScriptBaseClass.PSYS_SRC_TARGET_KEY: UUID key = UUID.Zero; if (UUID.TryParse(rules.Data[i + 1].ToString(), out key)) { prules.Target = key; } else { prules.Target = part.UUID; } break; case (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; break; case (int)ScriptBaseClass.PSYS_SRC_ANGLE_BEGIN: tempf = (float)rules.GetLSLFloatItem(i + 1); prules.InnerAngle = (float)tempf; prules.PartFlags |= 0x02; // Set new angle format. break; case (int)ScriptBaseClass.PSYS_SRC_ANGLE_END: tempf = (float)rules.GetLSLFloatItem(i + 1); prules.OuterAngle = (float)tempf; prules.PartFlags |= 0x02; // Set new angle format. break; } } prules.CRC = 1; part.AddNewParticleSystem(prules); part.ParentGroup.HasGroupChanged = true; } part.SendFullUpdateToAllClients(); }
protected void SetScale(SceneObjectPart part, LSL_Vector scale) { // TODO: this needs to trigger a persistance save as well if (part == null || part.ParentGroup.IsDeleted) return; if (scale.x < 0.01) scale.x = 0.01; if (scale.y < 0.01) scale.y = 0.01; if (scale.z < 0.01) scale.z = 0.01; PhysicsActor pa = part.ParentGroup.RootPart.PhysActor; if (pa != null && pa.IsPhysical) { if (scale.x > World.m_maxPhys) scale.x = World.m_maxPhys; if (scale.y > World.m_maxPhys) scale.y = World.m_maxPhys; if (scale.z > World.m_maxPhys) scale.z = World.m_maxPhys; } if (scale.x > World.m_maxNonphys) scale.x = World.m_maxNonphys; if (scale.y > World.m_maxNonphys) scale.y = World.m_maxNonphys; if (scale.z > World.m_maxNonphys) scale.z = World.m_maxNonphys; Vector3 tmp = part.Scale; tmp.X = (float)scale.x; tmp.Y = (float)scale.y; tmp.Z = (float)scale.z; part.Scale = tmp; part.SendFullUpdateToAllClients(); }
protected void SetScale(SceneObjectPart part, LSL_Vector scale) { // TODO: this needs to trigger a persistance save as well if (part == null || part.ParentGroup.IsDeleted) return; // First we need to check whether or not we need to clamp the size of a physics-enabled prim PhysicsActor pa = part.ParentGroup.RootPart.PhysActor; if (pa != null && pa.IsPhysical) { scale.x = Math.Max(World.m_minPhys, Math.Min(World.m_maxPhys, scale.x)); scale.y = Math.Max(World.m_minPhys, Math.Min(World.m_maxPhys, scale.y)); scale.z = Math.Max(World.m_minPhys, Math.Min(World.m_maxPhys, scale.z)); } else { // If not physical, then we clamp the scale to the non-physical min/max scale.x = Math.Max(World.m_minNonphys, Math.Min(World.m_maxNonphys, scale.x)); scale.y = Math.Max(World.m_minNonphys, Math.Min(World.m_maxNonphys, scale.y)); scale.z = Math.Max(World.m_minNonphys, Math.Min(World.m_maxNonphys, scale.z)); } Vector3 tmp = part.Scale; tmp.X = (float)scale.x; tmp.Y = (float)scale.y; tmp.Z = (float)scale.z; part.Scale = tmp; part.SendFullUpdateToAllClients(); }
private static void StopSound(SceneObjectPart m_host) { m_host.AdjustSoundGain(0); // Xantor 20080528: Clear prim data of sound instead if (m_host.ParentGroup.LoopSoundSlavePrims.Contains(m_host)) { if (m_host.ParentGroup.LoopSoundMasterPrim == m_host) { foreach (SceneObjectPart part in m_host.ParentGroup.LoopSoundSlavePrims) { part.Sound = UUID.Zero; part.SoundFlags = 1 << 5; part.SoundRadius = 0; part.ScheduleFullUpdate(); part.SendFullUpdateToAllClients(); } m_host.ParentGroup.LoopSoundMasterPrim = null; m_host.ParentGroup.LoopSoundSlavePrims.Clear(); } else { m_host.Sound = UUID.Zero; m_host.SoundFlags = 1 << 5; m_host.SoundRadius = 0; m_host.ScheduleFullUpdate(); m_host.SendFullUpdateToAllClients(); } } else { m_host.Sound = UUID.Zero; m_host.SoundFlags = 1 << 5; m_host.SoundRadius = 0; m_host.ScheduleFullUpdate(); m_host.SendFullUpdateToAllClients(); } }
private void SetParticleSystem(SceneObjectPart part, LSL_List rules, string originFunc) { if (rules.Length == 0) { part.RemoveParticleSystem(); part.ParentGroup.HasGroupChanged = true; } 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) { int psystype; try { psystype = rules.GetLSLIntegerItem(i); } catch (InvalidCastException) { Error(originFunc, string.Format("Error running particle system params index #{0}: particle system parameter type must be integer", i)); return; } switch (psystype) { case (int)ScriptBaseClass.PSYS_PART_FLAGS: try { prules.PartDataFlags = (Primitive.ParticleSystem.ParticleDataFlags)(uint)rules.GetLSLIntegerItem(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_PART_FLAGS: arg #{0} - parameter 1 must be integer", i + 1)); return; } break; case (int)ScriptBaseClass.PSYS_PART_START_COLOR: try { tempv = rules.GetVector3Item(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_PART_START_COLOR: arg #{0} - parameter 1 must be vector", i + 1)); return; } prules.PartStartColor.R = (float)tempv.x; prules.PartStartColor.G = (float)tempv.y; prules.PartStartColor.B = (float)tempv.z; break; case (int)ScriptBaseClass.PSYS_PART_START_ALPHA: try { tempf = (float)rules.GetLSLFloatItem(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_PART_START_ALPHA: arg #{0} - parameter 1 must be float", i + 1)); return; } prules.PartStartColor.A = tempf; break; case (int)ScriptBaseClass.PSYS_PART_END_COLOR: try { tempv = rules.GetVector3Item(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_PART_END_COLOR: arg #{0} - parameter 1 must be vector", i + 1)); return; } prules.PartEndColor.R = (float)tempv.x; prules.PartEndColor.G = (float)tempv.y; prules.PartEndColor.B = (float)tempv.z; break; case (int)ScriptBaseClass.PSYS_PART_END_ALPHA: try { tempf = (float)rules.GetLSLFloatItem(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_PART_END_ALPHA: arg #{0} - parameter 1 must be float", i + 1)); return; } prules.PartEndColor.A = tempf; break; case (int)ScriptBaseClass.PSYS_PART_START_SCALE: try { tempv = rules.GetVector3Item(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_PART_START_SCALE: arg #{0} - parameter 1 must be vector", i + 1)); return; } prules.PartStartScaleX = validParticleScale((float)tempv.x); prules.PartStartScaleY = validParticleScale((float)tempv.y); break; case (int)ScriptBaseClass.PSYS_PART_END_SCALE: try { tempv = rules.GetVector3Item(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_PART_END_SCALE: arg #{0} - parameter 1 must be vector", i + 1)); return; } prules.PartEndScaleX = validParticleScale((float)tempv.x); prules.PartEndScaleY = validParticleScale((float)tempv.y); break; case (int)ScriptBaseClass.PSYS_PART_MAX_AGE: try { tempf = (float)rules.GetLSLFloatItem(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_PART_MAX_AGE: arg #{0} - parameter 1 must be float", i + 1)); return; } prules.PartMaxAge = tempf; break; case (int)ScriptBaseClass.PSYS_SRC_ACCEL: try { tempv = rules.GetVector3Item(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_SRC_ACCEL: arg #{0} - parameter 1 must be vector", i + 1)); return; } prules.PartAcceleration.X = (float)tempv.x; prules.PartAcceleration.Y = (float)tempv.y; prules.PartAcceleration.Z = (float)tempv.z; break; case (int)ScriptBaseClass.PSYS_SRC_PATTERN: try { tmpi = (int)rules.GetLSLIntegerItem(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_SRC_PATTERN: arg #{0} - parameter 1 must be integer", i + 1)); return; } prules.Pattern = (Primitive.ParticleSystem.SourcePattern)tmpi; break; // 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. case (int)ScriptBaseClass.PSYS_SRC_INNERANGLE: try { tempf = (float)rules.GetLSLFloatItem(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_SRC_INNERANGLE: arg #{0} - parameter 1 must be float", i + 1)); return; } prules.InnerAngle = (float)tempf; prules.PartFlags &= 0xFFFFFFFD; // Make sure new angle format is off. break; case (int)ScriptBaseClass.PSYS_SRC_OUTERANGLE: try { tempf = (float)rules.GetLSLFloatItem(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_SRC_OUTERANGLE: arg #{0} - parameter 1 must be float", i + 1)); return; } prules.OuterAngle = (float)tempf; prules.PartFlags &= 0xFFFFFFFD; // Make sure new angle format is off. break; case (int)ScriptBaseClass.PSYS_PART_BLEND_FUNC_SOURCE: try { tmpi = (int)rules.GetLSLIntegerItem(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_PART_BLEND_FUNC_SOURCE: arg #{0} - parameter 1 must be integer", i + 1)); return; } prules.BlendFuncSource = (byte)tmpi; break; case (int)ScriptBaseClass.PSYS_PART_BLEND_FUNC_DEST: try { tmpi = (int)rules.GetLSLIntegerItem(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_PART_BLEND_FUNC_DEST: arg #{0} - parameter 1 must be integer", i + 1)); return; } prules.BlendFuncDest = (byte)tmpi; break; case (int)ScriptBaseClass.PSYS_PART_START_GLOW: try { tempf = (float)rules.GetLSLFloatItem(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_PART_START_GLOW: arg #{0} - parameter 1 must be float", i + 1)); return; } prules.PartStartGlow = (float)tempf; break; case (int)ScriptBaseClass.PSYS_PART_END_GLOW: try { tempf = (float)rules.GetLSLFloatItem(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_PART_END_GLOW: arg #{0} - parameter 1 must be float", i + 1)); return; } prules.PartEndGlow = (float)tempf; break; case (int)ScriptBaseClass.PSYS_SRC_TEXTURE: try { prules.Texture = ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, rules.GetLSLStringItem(i + 1)); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_SRC_TEXTURE: arg #{0} - parameter 1 must be string or key", i + 1)); return; } break; case (int)ScriptBaseClass.PSYS_SRC_BURST_RATE: try { tempf = (float)rules.GetLSLFloatItem(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_SRC_BURST_RATE: arg #{0} - parameter 1 must be float", i + 1)); return; } prules.BurstRate = (float)tempf; break; case (int)ScriptBaseClass.PSYS_SRC_BURST_PART_COUNT: try { prules.BurstPartCount = (byte)(int)rules.GetLSLIntegerItem(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_SRC_BURST_PART_COUNT: arg #{0} - parameter 1 must be integer", i + 1)); return; } break; case (int)ScriptBaseClass.PSYS_SRC_BURST_RADIUS: try { tempf = (float)rules.GetLSLFloatItem(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_SRC_BURST_RADIUS: arg #{0} - parameter 1 must be float", i + 1)); return; } prules.BurstRadius = (float)tempf; break; case (int)ScriptBaseClass.PSYS_SRC_BURST_SPEED_MIN: try { tempf = (float)rules.GetLSLFloatItem(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_SRC_BURST_SPEED_MIN: arg #{0} - parameter 1 must be float", i + 1)); return; } prules.BurstSpeedMin = (float)tempf; break; case (int)ScriptBaseClass.PSYS_SRC_BURST_SPEED_MAX: try { tempf = (float)rules.GetLSLFloatItem(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_SRC_BURST_SPEED_MAX: arg #{0} - parameter 1 must be float", i + 1)); return; } prules.BurstSpeedMax = (float)tempf; break; case (int)ScriptBaseClass.PSYS_SRC_MAX_AGE: try { tempf = (float)rules.GetLSLFloatItem(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_SRC_MAX_AGE: arg #{0} - parameter 1 must be float", i + 1)); return; } prules.MaxAge = (float)tempf; break; case (int)ScriptBaseClass.PSYS_SRC_TARGET_KEY: UUID key = UUID.Zero; if (UUID.TryParse(rules.Data[i + 1].ToString(), out key)) { prules.Target = key; } else { prules.Target = part.UUID; } break; case (int)ScriptBaseClass.PSYS_SRC_OMEGA: // AL: This is an assumption, since it is the only thing that would match. try { tempv = rules.GetVector3Item(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_SRC_OMEGA: arg #{0} - parameter 1 must be vector", i + 1)); return; } prules.AngularVelocity.X = (float)tempv.x; prules.AngularVelocity.Y = (float)tempv.y; prules.AngularVelocity.Z = (float)tempv.z; break; case (int)ScriptBaseClass.PSYS_SRC_ANGLE_BEGIN: try { tempf = (float)rules.GetLSLFloatItem(i + 1); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_SRC_ANGLE_BEGIN: arg #{0} - parameter 1 must be float", i + 1)); return; } prules.InnerAngle = (float)tempf; prules.PartFlags |= 0x02; // Set new angle format. break; case (int)ScriptBaseClass.PSYS_SRC_ANGLE_END: try { tempf = (float)rules.GetLSLFloatItem(i + 1); } catch (InvalidCastException) { Error(originFunc, string.Format("Error running rule PSYS_SRC_ANGLE_END: arg #{0} - parameter 1 must be float", i + 1)); return; } prules.OuterAngle = (float)tempf; prules.PartFlags |= 0x02; // Set new angle format. break; } } prules.CRC = 1; part.AddNewParticleSystem(prules); part.ParentGroup.HasGroupChanged = true; } part.SendFullUpdateToAllClients(); }
private static void StopSound(SceneObjectPart m_host) { // m_host.AdjustSoundGain(0); m_host.Sound = UUID.Zero; m_host.SoundFlags = (byte)SoundFlags.STOP; m_host.SoundRadius = 0; m_host.SoundGain = 0; m_host.ScheduleFullUpdate(); m_host.SendFullUpdateToAllClients(); }