Files
VMSolidus 4d43d53c6f Ghostroles In Lobby Manifest (#21772)
This PR makes it so that player characters who are active in the
ghostrole list will show up on the Crew Manifest, but only if you the
player are not currently in-round. Any type of Observer, including
ghosts, aghosts, and actually being in the lobby, all allow the user to
view Off-ship characters in the manifest. If you are not any kind of
observer, the Crew Manifest will only show Horizon characters.


I have tested this PR. Behold.


https://github.com/user-attachments/assets/76ffb40a-bb67-4719-a2e7-df04f38b929e
2026-02-03 10:09:49 +00:00

207 lines
6.6 KiB
Plaintext

/datum/ghostspawner/human
short_name = null
name = null
desc = null
respawn_flag = CREW
disable_and_hide_if_full = FALSE
//Vars regarding the mob to use
spawn_mob = /mob/living/carbon/human //The mob that should be spawned
variables = list() //Variables of that mob
//Vars related to human mobs
/// Outfit to equip
/// Should either be a subtype of `/obj/outfit`, and then it is that specific outfit
/// Or a list of subtypes, where it randomly picks one outfit from that list
var/outfit = null
/// Outfit overwrite for the species
var/list/species_outfits = list()
var/uses_species_whitelist = TRUE //Do you need the whitelist to play the species?
var/possible_species = list(SPECIES_HUMAN)
var/allow_appearance_change = APPEARANCE_PLASTICSURGERY
var/list/extra_languages = list() //Which languages are added to this mob
var/assigned_role = null
var/special_role = null
var/faction = null
/// Culture restrictions for this spawner. Use types. Make sure that there is at least one culture per allowed species!
var/list/culture_restriction = list()
/// Origin restrictions for this spawner. Use types. Not required if culture restriction is set. Make sure that there is at least one origin per allowed species!
var/list/origin_restriction = list()
mob_name = null
/// Determines whether the mob will have an Idris banking account when they spawn in
var/has_idris_account = TRUE
/// Determines whether the Idris banking account will be visible on the station's account terminal
var/is_idris_account_public = FALSE
/// The minimum amount of money the account can spawn with
var/idris_account_min = 100
/// The maximum amount of money the account can spawn with
var/idris_account_max = 500
//Return a error message if the user CANT spawn. Otherwise FALSE
/datum/ghostspawner/human/cant_spawn(mob/user)
//If whitelist is required, check if user can spawn in ANY of the possible species
if(uses_species_whitelist)
var/can_spawn_as_any = FALSE
for (var/S in possible_species)
if(is_alien_whitelisted(user, S))
can_spawn_as_any = TRUE
break
if(!can_spawn_as_any)
return "This spawner requires whitelists for its spawnable species, and you do not have any such."
. = ..()
//Proc executed before someone is spawned in
/datum/ghostspawner/human/pre_spawn(mob/user)
. = ..()
/datum/ghostspawner/human/proc/get_mob_name(mob/user, var/species, var/gender)
var/mname = mob_name
if(isnull(mname))
var/pick_message = "[mob_name_pick_message] ([species])"
if(mob_name_prefix)
pick_message = "[pick_message] Auto Prefix: \"[mob_name_prefix]\" "
if(mob_name_suffix)
pick_message = "[pick_message] Auto Suffix: \"[mob_name_suffix]\" "
mname = sanitizeName(tgui_input_text(user, pick_message, "Name for a [species] (without prefix/suffix)"))
if(!length(mname))
if(mob_name_prefix || mob_name_suffix)
mname = capitalize(pick(GLOB.last_names))
else
mname = random_name(gender,species)
if(mob_name_prefix)
mname = replacetext(mname,mob_name_prefix,"") //Remove the prefix if it exists in the string
mname = "[mob_name_prefix][mname]"
if(mob_name_suffix)
mname = replacetext(mname,mob_name_suffix,"") //Remove the suffix if it exists in the string
mname = "[mname][mob_name_suffix]"
return mname
//The proc to actually spawn in the user
/datum/ghostspawner/human/spawn_mob(mob/user)
//Select a spawnpoint (if available)
var/turf/T = select_spawnlocation()
if(!T)
LOG_DEBUG("GhostSpawner: Unable to select spawnpoint for [short_name]")
return FALSE
//Pick a species
var/list/species_selection = list()
for (var/S in possible_species)
if(!uses_species_whitelist)
species_selection += S
else if(is_alien_whitelisted(user, S))
species_selection += S
var/picked_species = tgui_input_list(user, "Select your species.", "Species Selection", species_selection)
if(!picked_species)
picked_species = possible_species[1]
var/datum/species/S = GLOB.all_species[picked_species]
var/assigned_gender = pick(S.default_genders)
//Get the name / age from them first
var/mname = get_mob_name(user, picked_species, assigned_gender)
var/age = tgui_input_number(user, "Enter your character's age.", "Age", 25, 1000, 0)
//Spawn in the mob
var/mob/living/carbon/human/M = new spawn_mob(GLOB.newplayer_start)
M.change_gender(assigned_gender)
M.set_species(picked_species)
//Prepare the mob
M.check_dna(M)
M.dna.ready_dna(M)
//Move the mob inside and initialize the mind
M.key = user.ckey //!! After that USER is invalid, so we have to use M
M.mind_initialize()
if(assigned_role)
M.mind.assigned_role = assigned_role
M.mind.role_alt_title = assigned_role
if(special_role)
M.mind.special_role = special_role
if(faction)
M.faction = faction
//Move the mob
M.forceMove(T)
M.lastarea = get_area(M.loc) //So gravity doesnt fuck them.
//Setup the mob age and name
if(!mname)
mname = random_name(M.gender, M.species.name)
M.fully_replace_character_name(M.real_name, mname)
M.mind.signature = mname
M.mind.signfont = pick("Verdana", "Times New Roman", "Courier New")
if(!age)
age = rand(35, 50)
M.age = clamp(age, 21, 65)
if(has_idris_account)
SSeconomy.create_and_assign_account(M, null, rand(idris_account_min, idris_account_max), is_idris_account_public)
//Setup the Outfit
if(picked_species in species_outfits)
var/obj/outfit/species_outfit = species_outfits[picked_species]
M.preEquipOutfit(species_outfit, FALSE)
M.equipOutfit(species_outfit, FALSE)
else if(outfit)
if(islist(outfit))
outfit = pick(outfit)
M.preEquipOutfit(outfit, FALSE)
M.equipOutfit(outfit, FALSE)
//Setup the appearance
if(allow_appearance_change)
M.change_appearance(allow_appearance_change, M, culture_restriction = src.culture_restriction, origin_restriction = src.origin_restriction, update_id = TRUE)
else //otherwise randomize
M.client.prefs.randomize_appearance_for(M, FALSE, culture_restriction, origin_restriction)
if(length(culture_restriction))
for(var/culture in culture_restriction)
var/singleton/origin_item/culture/CL = GET_SINGLETON(culture)
if(CL.type in M.species.possible_cultures)
M.set_culture(CL)
break
for(var/origin in M.culture.possible_origins)
var/singleton/origin_item/origin/OI = GET_SINGLETON(origin)
if(length(origin_restriction))
if(!(OI.type in origin_restriction))
continue
M.set_origin(OI)
M.accent = pick(OI.possible_accents)
break
for(var/language in extra_languages)
M.add_language(language)
M.force_update_limbs()
M.update_eyes()
M.regenerate_icons()
M.ghost_spawner = WEAKREF(src)
return M
/// Used for cryo to free up a slot when a ghost cryos.
/mob/living/carbon/human
var/datum/weakref/ghost_spawner