protected void SetPos(ISceneChildEntity part, LSL_Vector targetPos) { // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos) LSL_Vector currentPos = GetPartLocalPos(part); float ground = 0; bool disable_underground_movement = m_ScriptEngine.Config.GetBoolean("DisableUndergroundMovement", true); ITerrainChannel heightmap = World.RequestModuleInterface<ITerrainChannel>(); if(heightmap != null) ground = heightmap.GetNormalizedGroundHeight((int)(float)targetPos.x, (int)(float)targetPos.y); if (part.ParentEntity == null) { if (ground != 0 && (targetPos.z < ground) && disable_underground_movement && m_host.AttachmentPoint == 0) targetPos.z = ground; LSL_Vector real_vec = SetPosAdjust(currentPos, targetPos); part.UpdateOffSet(new Vector3((float)real_vec.x, (float)real_vec.y, (float)real_vec.z)); } else if (part.ParentEntity.RootChild == part) { ISceneEntity parent = part.ParentEntity; if (!part.IsAttachment) { if (ground != 0 && (targetPos.z < ground) && disable_underground_movement) targetPos.z = ground; } LSL_Vector real_vec = SetPosAdjust(currentPos, targetPos); parent.UpdateGroupPosition(new Vector3((float)real_vec.x, (float)real_vec.y, (float)real_vec.z), true); } else { LSL_Vector rel_vec = SetPosAdjust(currentPos, targetPos); part.FixOffsetPosition((new Vector3((float)rel_vec.x, (float)rel_vec.y, (float)rel_vec.z)),true); ISceneEntity parent = part.ParentEntity; parent.ScheduleGroupTerseUpdate(); } }