/// <summary> /// Gets params for a seated avatar in a linkset. /// </summary> /// <returns></returns> /// <param name='sp'></param> /// <param name='rules'></param> /// <param name='res'></param> public LSL_List GetAgentParams(ScenePresence sp, LSL_List rules, ref LSL_List res) { int idx = 0; while (idx < rules.Length) { int code = (int)rules.GetLSLIntegerItem(idx++); int remain = rules.Length-idx; switch (code) { case (int)ScriptBaseClass.PRIM_MATERIAL: res.Add(new LSL_Integer(ScriptBaseClass.PRIM_MATERIAL_FLESH)); break; case (int)ScriptBaseClass.PRIM_PHYSICS: res.Add(ScriptBaseClass.FALSE); break; case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ: res.Add(ScriptBaseClass.FALSE); break; case (int)ScriptBaseClass.PRIM_PHANTOM: res.Add(ScriptBaseClass.FALSE); break; case (int)ScriptBaseClass.PRIM_POSITION: res.Add(new LSL_Vector(sp.AbsolutePosition)); break; case (int)ScriptBaseClass.PRIM_SIZE: res.Add(GetAgentSize(sp)); break; case (int)ScriptBaseClass.PRIM_ROTATION: res.Add(sp.GetWorldRotation()); break; case (int)ScriptBaseClass.PRIM_TYPE: res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TYPE_BOX)); res.Add(new LSL_Integer(ScriptBaseClass.PRIM_HOLE_DEFAULT)); res.Add(new LSL_Vector(0, 1, 0)); res.Add(new LSL_Float(0)); res.Add(new LSL_Vector(0, 0, 0)); res.Add(new LSL_Vector(1, 1, 0)); res.Add(new LSL_Vector(0, 0, 0)); break; case (int)ScriptBaseClass.PRIM_TEXTURE: if (remain < 1) return null; int face = (int)rules.GetLSLIntegerItem(idx++); if (face > 21) break; res.Add(new LSL_String("")); res.Add(ScriptBaseClass.ZERO_VECTOR); res.Add(ScriptBaseClass.ZERO_VECTOR); res.Add(new LSL_Float(0)); break; case (int)ScriptBaseClass.PRIM_COLOR: if (remain < 1) return null; face = (int)rules.GetLSLIntegerItem(idx++); if (face > 21) break; res.Add(ScriptBaseClass.ZERO_VECTOR); res.Add(new LSL_Float(0)); break; case (int)ScriptBaseClass.PRIM_BUMP_SHINY: if (remain < 1) return null; face = (int)rules.GetLSLIntegerItem(idx++); if (face > 21) break; res.Add(ScriptBaseClass.PRIM_SHINY_NONE); res.Add(ScriptBaseClass.PRIM_BUMP_NONE); break; case (int)ScriptBaseClass.PRIM_FULLBRIGHT: if (remain < 1) return null; face = (int)rules.GetLSLIntegerItem(idx++); if (face > 21) break; res.Add(ScriptBaseClass.FALSE); break; case (int)ScriptBaseClass.PRIM_FLEXIBLE: res.Add(ScriptBaseClass.FALSE); res.Add(new LSL_Integer(0)); res.Add(new LSL_Float(0)); res.Add(new LSL_Float(0)); res.Add(new LSL_Float(0)); res.Add(new LSL_Float(0)); res.Add(ScriptBaseClass.ZERO_VECTOR); break; case (int)ScriptBaseClass.PRIM_TEXGEN: if (remain < 1) return null; face = (int)rules.GetLSLIntegerItem(idx++); if (face > 21) break; res.Add(ScriptBaseClass.PRIM_TEXGEN_DEFAULT); break; case (int)ScriptBaseClass.PRIM_POINT_LIGHT: res.Add(ScriptBaseClass.FALSE); res.Add(ScriptBaseClass.ZERO_VECTOR); res.Add(ScriptBaseClass.ZERO_VECTOR); break; case (int)ScriptBaseClass.PRIM_GLOW: if (remain < 1) return null; face = (int)rules.GetLSLIntegerItem(idx++); if (face > 21) break; res.Add(new LSL_Float(0)); break; case (int)ScriptBaseClass.PRIM_TEXT: res.Add(new LSL_String("")); res.Add(ScriptBaseClass.ZERO_VECTOR); res.Add(new LSL_Float(1)); break; case (int)ScriptBaseClass.PRIM_ROT_LOCAL: res.Add(new LSL_Rotation(sp.Rotation)); break; case (int)ScriptBaseClass.PRIM_POS_LOCAL: res.Add(new LSL_Vector(sp.OffsetPosition)); break; case (int)ScriptBaseClass.PRIM_SLICE: res.Add(new LSL_Vector(0, 1, 0)); break; case (int)ScriptBaseClass.PRIM_LINK_TARGET: if(remain < 3) return null; return rules.GetSublist(idx, -1); } } return null; }
public LSL_List GetPrimParams(ScenePresence avatar, LSL_List rules, ref LSL_List res) { // avatars case // replies as SL wiki // SceneObjectPart sitPart = avatar.ParentPart; // most likelly it will be needed SceneObjectPart sitPart = World.GetSceneObjectPart(avatar.ParentID); // maybe better do this expensive search for it in case it's gone?? int idx = 0; while (idx < rules.Length) { int code = (int)rules.GetLSLIntegerItem(idx++); int remain = rules.Length - idx; switch (code) { case (int)ScriptBaseClass.PRIM_MATERIAL: res.Add(new LSL_Integer((int)SOPMaterialData.SopMaterial.Flesh)); break; case (int)ScriptBaseClass.PRIM_PHYSICS: res.Add(new LSL_Integer(0)); break; case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ: res.Add(new LSL_Integer(0)); break; case (int)ScriptBaseClass.PRIM_PHANTOM: res.Add(new LSL_Integer(0)); break; case (int)ScriptBaseClass.PRIM_POSITION: Vector3 pos; if (sitPart.ParentGroup.RootPart != null) { pos = avatar.OffsetPosition; if(!avatar.LegacySitOffsets) { Vector3 sitOffset = (Zrot(avatar.Rotation)) * (avatar.Appearance.AvatarHeight * 0.02638f *2.0f); pos -= sitOffset; } SceneObjectPart sitroot = sitPart.ParentGroup.RootPart; pos = sitroot.AbsolutePosition + pos * sitroot.GetWorldRotation(); } else pos = avatar.AbsolutePosition; res.Add(new LSL_Vector(pos.X,pos.Y,pos.Z)); break; case (int)ScriptBaseClass.PRIM_SIZE: Vector3 s = avatar.Appearance.AvatarSize; res.Add(new LSL_Vector(s.X, s.Y, s.Z)); break; case (int)ScriptBaseClass.PRIM_ROTATION: res.Add(new LSL_Rotation(avatar.GetWorldRotation())); break; case (int)ScriptBaseClass.PRIM_TYPE: res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TYPE_BOX)); res.Add(new LSL_Integer(ScriptBaseClass.PRIM_HOLE_DEFAULT)); res.Add(new LSL_Vector(0f,1.0f,0f)); res.Add(new LSL_Float(0.0f)); res.Add(new LSL_Vector(0, 0, 0)); res.Add(new LSL_Vector(1.0f,1.0f,0f)); res.Add(new LSL_Vector(0, 0, 0)); break; case (int)ScriptBaseClass.PRIM_TEXTURE: if (remain < 1) return new LSL_List(); int face = (int)rules.GetLSLIntegerItem(idx++); if (face == ScriptBaseClass.ALL_SIDES) { for (face = 0; face < 21; face++) { res.Add(new LSL_String("")); res.Add(new LSL_Vector(0,0,0)); res.Add(new LSL_Vector(0,0,0)); res.Add(new LSL_Float(0.0)); } } else { if (face >= 0 && face < 21) { res.Add(new LSL_String("")); res.Add(new LSL_Vector(0,0,0)); res.Add(new LSL_Vector(0,0,0)); res.Add(new LSL_Float(0.0)); } } break; case (int)ScriptBaseClass.PRIM_COLOR: if (remain < 1) return new LSL_List(); face = (int)rules.GetLSLIntegerItem(idx++); if (face == ScriptBaseClass.ALL_SIDES) { for (face = 0; face < 21; face++) { res.Add(new LSL_Vector(0,0,0)); res.Add(new LSL_Float(0)); } } else { res.Add(new LSL_Vector(0,0,0)); res.Add(new LSL_Float(0)); } break; case (int)ScriptBaseClass.PRIM_BUMP_SHINY: if (remain < 1) return new LSL_List(); face = (int)rules.GetLSLIntegerItem(idx++); if (face == ScriptBaseClass.ALL_SIDES) { for (face = 0; face < 21; face++) { res.Add(new LSL_Integer(ScriptBaseClass.PRIM_SHINY_NONE)); res.Add(new LSL_Integer(ScriptBaseClass.PRIM_BUMP_NONE)); } } else { res.Add(new LSL_Integer(ScriptBaseClass.PRIM_SHINY_NONE)); res.Add(new LSL_Integer(ScriptBaseClass.PRIM_BUMP_NONE)); } break; case (int)ScriptBaseClass.PRIM_FULLBRIGHT: if (remain < 1) return new LSL_List(); face = (int)rules.GetLSLIntegerItem(idx++); if (face == ScriptBaseClass.ALL_SIDES) { for (face = 0; face < 21; face++) { res.Add(new LSL_Integer(ScriptBaseClass.FALSE)); } } else { res.Add(new LSL_Integer(ScriptBaseClass.FALSE)); } break; case (int)ScriptBaseClass.PRIM_FLEXIBLE: res.Add(new LSL_Integer(0)); res.Add(new LSL_Integer(0));// softness res.Add(new LSL_Float(0.0f)); // gravity res.Add(new LSL_Float(0.0f)); // friction res.Add(new LSL_Float(0.0f)); // wind res.Add(new LSL_Float(0.0f)); // tension res.Add(new LSL_Vector(0f,0f,0f)); break; case (int)ScriptBaseClass.PRIM_TEXGEN: // (PRIM_TEXGEN_DEFAULT, PRIM_TEXGEN_PLANAR) if (remain < 1) return new LSL_List(); face = (int)rules.GetLSLIntegerItem(idx++); if (face == ScriptBaseClass.ALL_SIDES) { for (face = 0; face < 21; face++) { res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TEXGEN_DEFAULT)); } } else { res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TEXGEN_DEFAULT)); } break; case (int)ScriptBaseClass.PRIM_POINT_LIGHT: res.Add(new LSL_Integer(0)); res.Add(new LSL_Vector(0f,0f,0f)); res.Add(new LSL_Float(0f)); // intensity res.Add(new LSL_Float(0f)); // radius res.Add(new LSL_Float(0f)); // falloff break; case (int)ScriptBaseClass.PRIM_GLOW: if (remain < 1) return new LSL_List(); face = (int)rules.GetLSLIntegerItem(idx++); if (face == ScriptBaseClass.ALL_SIDES) { for (face = 0; face < 21; face++) { res.Add(new LSL_Float(0f)); } } else { res.Add(new LSL_Float(0f)); } break; case (int)ScriptBaseClass.PRIM_TEXT: res.Add(new LSL_String("")); res.Add(new LSL_Vector(0f,0f,0f)); res.Add(new LSL_Float(1.0f)); break; case (int)ScriptBaseClass.PRIM_NAME: res.Add(new LSL_String(avatar.Name)); break; case (int)ScriptBaseClass.PRIM_DESC: res.Add(new LSL_String("")); break; case (int)ScriptBaseClass.PRIM_ROT_LOCAL: Quaternion lrot = avatar.Rotation; res.Add(new LSL_Rotation(lrot.X, lrot.Y, lrot.Z, lrot.W)); break; case (int)ScriptBaseClass.PRIM_POS_LOCAL: Vector3 lpos = avatar.OffsetPosition; if(!avatar.LegacySitOffsets) { Vector3 lsitOffset = (Zrot(avatar.Rotation)) * (avatar.Appearance.AvatarHeight * 0.02638f * 2.0f); lpos -= lsitOffset; } res.Add(new LSL_Vector(lpos.X,lpos.Y,lpos.Z)); 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); } } return new LSL_List(); }