diff --git a/code/_helpers/mobs.dm b/code/_helpers/mobs.dm index 0b0e3593eb..8bb66f8bd4 100644 --- a/code/_helpers/mobs.dm +++ b/code/_helpers/mobs.dm @@ -47,7 +47,9 @@ continue if(S.name == DEVELOPER_WARNING_NAME) continue - if( !(species in S.species_allowed)) + if(!(species in S.species_allowed)) + continue + if(!S.can_be_selected) continue valid_hairstyles[hairstyle] = GLOB.hair_styles_list[hairstyle] @@ -68,7 +70,9 @@ continue if(S.name == DEVELOPER_WARNING_NAME) continue - if( !(species in S.species_allowed)) + if(!(species in S.species_allowed)) + continue + if(!S.can_be_selected) continue valid_facialhairstyles[facialhairstyle] = GLOB.facial_hair_styles_list[facialhairstyle] diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index 5d85bf4a85..87e197dc1d 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -63,6 +63,8 @@ var/const/preview_icons = 'icons/mob/human_races/preview.dmi' continue if(instance.species_allowed && (!species || !(species in instance.species_allowed)) && (!client || !check_rights_for(client, R_ADMIN | R_EVENT | R_FUN)) && (!custom_base || !(custom_base in instance.species_allowed))) continue + if(!instance.can_be_selected && (!client || !check_rights_for(client, R_HOLDER))) + continue .[instance.name] = instance /datum/preferences/proc/mass_edit_marking_list(var/marking, var/change_on = TRUE, var/change_color = TRUE, var/marking_value = null, var/on = TRUE, var/color = "#000000") diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index 6921721a36..f4b7de4043 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -215,6 +215,9 @@ if(!(use_species in S.species_allowed)) continue + if(!S.can_be_selected && (!client || !check_rights_for(client, R_HOLDER))) + continue + if(S.ckeys_allowed && !(ckey in S.ckeys_allowed)) //VOREStation add - ckey whitelist check continue //VOREStation add - ckey whitelist check @@ -244,6 +247,9 @@ if(!(use_species in S.species_allowed)) continue + if(!S.can_be_selected && (!client || !check_rights_for(client, R_HOLDER))) + continue + if(S.ckeys_allowed && !(ckey in S.ckeys_allowed)) //VOREStation add - ckey whitelist check continue //VOREStation add - ckey whitelist check diff --git a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm index a3898f4fc2..1cada8bd23 100644 --- a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm +++ b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm @@ -94,6 +94,8 @@ var/list/wrapped_species_by_ref = list() continue if(!(species.get_bodytype(src) in S.species_allowed)) continue + if(!S.can_be_selected && (!client || !check_rights_for(client, R_HOLDER))) + continue valid_hairstyles += hairstyle for(var/facialhairstyle in GLOB.facial_hair_styles_list) var/datum/sprite_accessory/S = GLOB.facial_hair_styles_list[facialhairstyle] @@ -105,6 +107,8 @@ var/list/wrapped_species_by_ref = list() continue if(!(species.get_bodytype(src) in S.species_allowed)) continue + if(!S.can_be_selected && (!client || !check_rights_for(client, R_HOLDER))) + continue valid_facialhairstyles += facialhairstyle diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 4b8a82e0d0..dc83f3b3b6 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -282,6 +282,8 @@ continue if(!(species in S.species_allowed) && (!custom_base || !(custom_base in S.species_allowed))) continue + if(!S.can_be_selected && (!client || !check_rights_for(client, R_HOLDER))) + continue if((!S.ckeys_allowed) || (user.ckey in S.ckeys_allowed)) valid_hairstyles[S.name] = hairstyle @@ -300,6 +302,8 @@ continue if(!(species in S.species_allowed) && (!custom_base || !(custom_base in S.species_allowed))) continue + if(!S.can_be_selected && (!client || !check_rights_for(client, R_HOLDER))) + continue valid_facialhairstyles[facialhairstyle] = GLOB.facial_hair_styles_list[facialhairstyle] diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 84dd22458a..f02ed04154 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -33,23 +33,27 @@ GLOBAL_LIST_INIT(fancy_sprite_accessory_color_channel_names, list("Primary", "Se var/name = DEVELOPER_WARNING_NAME // the preview name of the accessory - // Determines if the accessory will be skipped or included in random hair generations + /// Determines if the accessory will be skipped or included in random hair generations var/gender = NEUTER - // Restrict some styles to specific species. Default to all species to avoid runtimes in character creator. + /// Restrict some styles to specific species. Default to all species to avoid runtimes in character creator. var/list/species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJARAN, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL, SPECIES_HANNER, SPECIES_ZADDAT, SPECIES_SPARKLE, SPECIES_PROMETHEAN, SPECIES_ZORREN_DARK) - // Whether or not the accessory can be affected by colouration + /// If the accessory can be selected normally. If FALSE, only staff can select it. + var/can_be_selected = TRUE + + /// Whether or not the accessory can be affected by colouration var/do_colouration = 1 var/color_blend_mode = ICON_MULTIPLY // If checked. - // Ckey of person allowed to use this, if defined. + /// Ckey of person allowed to use this, if defined. var/list/ckeys_allowed = null /// Should this sprite block emissives? var/em_block = FALSE + /// What body parts we hide when this accessory is worn. Only blocks the body part if the accompanying organ in body_parts is also enabled. var/list/hide_body_parts = list() //Uses organ tag defines. Bodyparts in this list do not have their icons rendered, allowing for more spriter freedom when doing taur/digitigrade stuff. /** diff --git a/code/modules/mob/new_player/sprite_accessories_markings.dm b/code/modules/mob/new_player/sprite_accessories_markings.dm index db2a6b01b5..c988073cb8 100644 --- a/code/modules/mob/new_player/sprite_accessories_markings.dm +++ b/code/modules/mob/new_player/sprite_accessories_markings.dm @@ -2896,3 +2896,100 @@ includes scars and tattoos icon = 'icons/mob/human_races/markings.dmi' color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_ARM,BP_R_ARM) + +// OAK TREE TRUNK // + +/datum/sprite_accessory/marking/treeoak + name = "Tree Trunk (Oak)" + icon_state = "tree_oak_trunk" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO, BP_GROIN, BP_HEAD, BP_R_ARM, BP_R_HAND, BP_L_ARM, BP_L_HAND) + hide_body_parts = list(BP_TORSO, BP_GROIN, BP_HEAD, BP_R_ARM, BP_R_HAND, BP_L_ARM, BP_L_HAND) + +// THIN BODY SHAPE // + +/datum/sprite_accessory/marking/thin1 + name = "Thin Bodytype" + icon_state = "thin1" + color_blend_mode = ICON_MULTIPLY + hide_body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_GROIN,BP_TORSO,BP_L_HAND,BP_R_HAND,BP_L_FOOT,BP_R_FOOT) + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_GROIN,BP_TORSO,BP_L_HAND,BP_R_HAND,BP_L_FOOT,BP_R_FOOT) + +/datum/sprite_accessory/marking/thin2 + name = "Thinner Bodytype" + icon_state = "thin2" + color_blend_mode = ICON_MULTIPLY + hide_body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/skeleton_full + name = "Skeleton (Neck Down)" + icon_state = "skeleton" + color_blend_mode = ICON_MULTIPLY + hide_body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + can_be_selected = FALSE + +//HEAD PIECES + +/datum/sprite_accessory/marking/protovisor + name = "Protogen Visor" + icon_state = "proto_visor" + body_parts = list(BP_HEAD) + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/marking/protovisor_gloss + name = "Protogen Visor (Gloss)" + icon_state = "proto_visor_gloss" + body_parts = list(BP_HEAD) + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/marking/protovisor_mouth + name = "Protogen Visor (Mouth)" + icon_state = "proto_visor_mouth" + body_parts = list(BP_HEAD) + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/marking/protovisor_eyes + name = "Protogen Visor (Eyes)" + icon_state = "proto_visor_eyes" + body_parts = list(BP_HEAD) + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/marking/protovisor_eyes_left + name = "Protogen Visor (Eye, Left)" + icon_state = "proto_visor_eyes_l" + body_parts = list(BP_HEAD) + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/marking/protovisor_eyes_right + name = "Protogen Visor (Eye, Right)" + icon_state = "proto_visor_eyes_r" + body_parts = list(BP_HEAD) + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/marking/protovisor_head + name = "Protogen Visor (Headpiece)" + icon_state = "proto_visor_band" + body_parts = list(BP_HEAD) + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/marking/protovisor_cheek + name = "Protogen Visor (Cheekpiece)" + icon_state = "proto_visor_cheek" + body_parts = list(BP_HEAD) + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/marking/skeleton_head_human + name = "Skeleton Head (Humanoid)" + icon_state = "skull_human" + body_parts = list(BP_HEAD) + color_blend_mode = ICON_MULTIPLY + hide_body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/skeleton_head_snout + name = "Skeleton Head (Snouted)" + icon_state = "skull_snout" + body_parts = list(BP_HEAD) + color_blend_mode = ICON_MULTIPLY + hide_body_parts = list(BP_HEAD) diff --git a/code/modules/tgui/modules/appearance_changer.dm b/code/modules/tgui/modules/appearance_changer.dm index 045c5ef1cf..4b5ca83a3a 100644 --- a/code/modules/tgui/modules/appearance_changer.dm +++ b/code/modules/tgui/modules/appearance_changer.dm @@ -991,6 +991,8 @@ return FALSE if(!isnull(X.species_allowed) && !(target.species.name in X.species_allowed) && (!istype(target.species, /datum/species/custom))) // Letting custom species access wings/ears/tails. return FALSE + if(!X.can_be_selected && (!user || !check_rights_for(user.client, R_HOLDER))) //So staff can quickly change people's appearance for events. + return FALSE if(LAZYLEN(X.ckeys_allowed) && !(user?.ckey in X.ckeys_allowed) && !(target.ckey in X.ckeys_allowed)) return FALSE diff --git a/icons/mob/human_races/markings.dmi b/icons/mob/human_races/markings.dmi index 7f3a203e38..a51ffc636c 100644 Binary files a/icons/mob/human_races/markings.dmi and b/icons/mob/human_races/markings.dmi differ