public SendTerseUpdateToAllClients ( ) : void | ||
return | void |
protected LSL_List SetPrimParams(ScenePresence av, LSL_List rules, string originFunc, ref uint rulesParsed) { //This is a special version of SetPrimParams to deal with avatars which are sitting on the linkset. int idx = 0; int idxStart = 0; bool positionChanged = false; try { while (idx < rules.Length) { ++rulesParsed; int code = rules.GetLSLIntegerItem(idx++); int remain = rules.Length - idx; idxStart = idx; switch (code) { case (int)ScriptBaseClass.PRIM_POSITION: case (int)ScriptBaseClass.PRIM_POS_LOCAL: { if (remain < 1) return new LSL_List(); LSL_Vector v; v = rules.GetVector3Item(idx++); if(!av.LegacySitOffsets) { LSL_Vector sitOffset = (llRot2Up(new LSL_Rotation(av.Rotation.X, av.Rotation.Y, av.Rotation.Z, av.Rotation.W)) * av.Appearance.AvatarHeight * 0.02638f); v = v + 2 * sitOffset; } av.OffsetPosition = new Vector3((float)v.x, (float)v.y, (float)v.z); positionChanged = true; } break; case (int)ScriptBaseClass.PRIM_ROTATION: { if (remain < 1) return new LSL_List(); Quaternion r; r = rules.GetQuaternionItem(idx++); av.Rotation = m_host.GetWorldRotation() * r; positionChanged = true; } break; case (int)ScriptBaseClass.PRIM_ROT_LOCAL: { if (remain < 1) return new LSL_List(); LSL_Rotation r; r = rules.GetQuaternionItem(idx++); av.Rotation = r; positionChanged = true; } break; // parse rest doing nothing but number of parameters error check case (int)ScriptBaseClass.PRIM_SIZE: case (int)ScriptBaseClass.PRIM_MATERIAL: case (int)ScriptBaseClass.PRIM_PHANTOM: case (int)ScriptBaseClass.PRIM_PHYSICS: case (int)ScriptBaseClass.PRIM_PHYSICS_SHAPE_TYPE: case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ: case (int)ScriptBaseClass.PRIM_NAME: case (int)ScriptBaseClass.PRIM_DESC: if (remain < 1) return new LSL_List(); idx++; break; case (int)ScriptBaseClass.PRIM_GLOW: case (int)ScriptBaseClass.PRIM_FULLBRIGHT: case (int)ScriptBaseClass.PRIM_TEXGEN: if (remain < 2) return new LSL_List(); idx += 2; break; case (int)ScriptBaseClass.PRIM_TYPE: if (remain < 3) return new LSL_List(); code = (int)rules.GetLSLIntegerItem(idx++); remain = rules.Length - idx; switch (code) { case (int)ScriptBaseClass.PRIM_TYPE_BOX: case (int)ScriptBaseClass.PRIM_TYPE_CYLINDER: case (int)ScriptBaseClass.PRIM_TYPE_PRISM: if (remain < 6) return new LSL_List(); idx += 6; break; case (int)ScriptBaseClass.PRIM_TYPE_SPHERE: if (remain < 5) return new LSL_List(); idx += 5; break; case (int)ScriptBaseClass.PRIM_TYPE_TORUS: case (int)ScriptBaseClass.PRIM_TYPE_TUBE: case (int)ScriptBaseClass.PRIM_TYPE_RING: if (remain < 11) return new LSL_List(); idx += 11; break; case (int)ScriptBaseClass.PRIM_TYPE_SCULPT: if (remain < 2) return new LSL_List(); idx += 2; break; } break; case (int)ScriptBaseClass.PRIM_COLOR: case (int)ScriptBaseClass.PRIM_TEXT: case (int)ScriptBaseClass.PRIM_BUMP_SHINY: case (int)ScriptBaseClass.PRIM_OMEGA: if (remain < 3) return new LSL_List(); idx += 3; break; case (int)ScriptBaseClass.PRIM_TEXTURE: case (int)ScriptBaseClass.PRIM_POINT_LIGHT: case (int)ScriptBaseClass.PRIM_PHYSICS_MATERIAL: if (remain < 5) return new LSL_List(); idx += 5; break; case (int)ScriptBaseClass.PRIM_FLEXIBLE: if (remain < 7) return new LSL_List(); idx += 7; break; case (int)ScriptBaseClass.PRIM_LINK_TARGET: if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless. return new LSL_List(); return rules.GetSublist(idx, -1); } } } catch (InvalidCastException e) { Error(originFunc,string.Format( " error running rule #{1}: arg #{2} ", rulesParsed, idx - idxStart) + e.Message); } finally { if (positionChanged) av.SendTerseUpdateToAllClients(); } return new LSL_List(); }