I used the script below as a scriptrunner behaviour script in an initializer, and I'm using it for 60+ Jira projects.
Please find the attached screenshots for your reference.
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.security.roles.ProjectRoleManager
import com.onresolve.jira.groovy.user.FieldBehaviours
import groovy.transform.BaseScript
import static com.atlassian.jira.issue.IssueFieldConstants.ISSUE_TYPE
def projectRoleManager = ComponentAccessor.getComponent(ProjectRoleManager)
def allIssueTypes = ComponentAccessor.constantsManager.allIssueTypeObjects
def user = ComponentAccessor.jiraAuthenticationContext.loggedInUser
def issueTypeField = getFieldById(ISSUE_TYPE)
def remoteUsersRoles = projectRoleManager.getProjectRoles(user, issueContext.projectObject)*.name
def availableIssueTypes = []
if ("Jira Security Role" in remoteUsersRoles) {
availableIssueTypes.addAll(allIssueTypes.findAll { it.name in ["Epic","Enabler","Feature"] })
}
if ("Users" in remoteUsersRoles) {
availableIssueTypes.addAll(allIssueTypes.findAll { it.name in ["Bug", "Defect", "Dependency", "Enhancement", "Spike", "Story", "Sub-task", "Support Request", "Task", "Customer Incident", "Troubleshoot Request", "Improvement", "Service Request","Tech Debt","Support"] })
}
issueTypeField.setFieldOptions(availableIssueTypes)