Files
Aurora.3/code/modules/ghostroles/spawner/base.dm
Geeves 69746693b5 Borer Tweaks and Changes (#8682)
Spawned borers now get added to the Ghostspawner menu, allowing players to inhabit them even if they didn't catch the original request.
    Borers have gained the ability to survey their host's health, allowing them to better choose when to administer certain chemicals.
    Borers now regenerate chemicals even if their host is unconscious.
    Awakening psionics now take 15 seconds instead of 10, and the host now gets a message about feeling something bad coming on, allowing them to make a dash to safety and or seclusion.
    Skrell returning from Srom no longer eject controlling borers to the lobby by replacing their ckey into the aether.
    Skrell no longer spontaneously die when entering Srom on a map that doesn't have a Srom location.
2020-05-15 23:39:32 +03:00

178 lines
6.6 KiB
Plaintext

/datum/ghostspawner
var/short_name = null
var/name = null
var/desc = null
var/show_on_job_select = TRUE
var/welcome_message = null
var/list/tags = list() //Tags associated with that spawner
//Vars regarding the spawnpoints and conditions of the spawner
var/list/spawnpoints = null //List of the applicable spawnpoints (by name)
var/list/spawn_atoms = list() // List of atoms you can spawn at
var/landmark_name = null //Alternatively you can specify a landmark name
var/max_count = 0 //How often can this spawner be used
var/count = 0 //How ofen has this spawner been used
var/req_perms = null //What permission flags are required to use this spawner
var/req_perms_edit = R_ADMIN
var/req_head_whitelist = FALSE //If a head of staff whitelist is required
var/req_species_whitelist = null //Name/Datum of the species whitelist that is required, or null
var/enabled = TRUE //If the spawnpoint is enabled
var/enable_chance = null //If set to a value other than null, has the set chance to become enabled
var/enable_dmessage = TRUE //The message to send to deadchat if the ghostspawner is enabled or TRUE for a default message
var/respawn_flag = null //Flag to check for when trying to spawn someone of that type (CREW, ANIMAL, MINISYNTH)
var/jobban_job = null //If this is set, then it will check if the user is jobbanned from a specific job. Otherwise it will check for the name of the spawner
//Vars regarding the mob to use
var/mob/spawn_mob = null //The mob that should be spawned
var/list/variables = list() //Variables of that mob
var/mob_name = FALSE //The name of that mob; If null prompts for it
var/mob_name_pick_message = "Pick a name."
var/mob_name_prefix = null //The prefix that should be applied to the mob (i.e. CCIAA, Tpr., Cmdr.)
var/mob_name_suffix = null //The suffix that should be applied to the mob name
var/away_site = FALSE
/datum/ghostspawner/New()
. = ..()
if(!jobban_job)
jobban_job = name
if(!isnull(enable_chance))
enabled = prob(enable_chance)
//Return a error message if the user CANT see the ghost spawner. Otherwise FALSE
/datum/ghostspawner/proc/cant_see(mob/user) //If the user can see the spawner in the menu
if(req_perms) //Only those with the correct flags can see restricted roles
if(check_rights(req_perms, show_msg=FALSE, user=user))
return FALSE //Return early and dont perform whitelist checks if staff flags are met
else
return "Missing Permissions"
if(req_head_whitelist && !check_whitelist(user))
return "Missing Head of Staff Whitelist"
if(jobban_job && jobban_isbanned(user,jobban_job))
return "Job Banned"
if(!enabled && !can_edit(user)) //If its not enabled and the user cant edit it, dont show it
return "Currently Disabled"
if(req_species_whitelist)
if(!is_alien_whitelisted(user, req_species_whitelist))
return "Missing Species Whitelist"
return FALSE
//Return a error message if the user CANT spawn. Otherwise FALSE
/datum/ghostspawner/proc/cant_spawn(mob/user) //If the user can spawn using the spawner
if(!ROUND_IS_STARTED)
return "The round is not started yet."
var/cant_see = cant_see(user)
if(cant_see) //If we cant see it, we cant spawn it
return cant_see
if(!(istype(user, /mob/abstract/observer) || isnewplayer(user)))
return "You are not a ghost."
if(!enabled) //If the spawner id disabled, we cant spawn in
return "This spawner is not enabled."
if(respawn_flag && !user.MayRespawn(0,respawn_flag))
return "You can not respawn at this time."
if(!config.enter_allowed)
return "There is an administrative lock on entering the game."
if(SSticker.mode?.explosion_in_progress)
return "The station is currently exploding."
if(max_count && count > max_count)
return "No more slots are available."
//Check if a spawnpoint is available
var/T = select_spawnpoint(FALSE)
if(!T)
return "No spawnpoint available."
return FALSE
//Proc executed before someone is spawned in
/datum/ghostspawner/proc/pre_spawn(mob/user)
count++ //Increment the spawned in mob count
if(max_count && count >= max_count)
enabled = FALSE
return TRUE
//This proc selects the spawnpoint to use.
/datum/ghostspawner/proc/select_spawnpoint(var/use=TRUE)
if(length(spawn_atoms))
var/chosen_spawn_atom = pick(spawn_atoms)
var/turf/T = get_turf(chosen_spawn_atom)
if(T)
return T
if(!isnull(spawnpoints))
for(var/spawnpoint in spawnpoints) //Loop through the applicable spawnpoints
var/turf/T = SSghostroles.get_spawnpoint(spawnpoint, use) //Gets the first matching spawnpoint or null if none are available
if(T) //If we have a spawnpoint, return it
return T
if(!isnull(landmark_name))
var/obj/effect/landmark/L
for(var/obj/effect/landmark/landmark in landmarks_list)
if(landmark.name == landmark_name)
L = landmark
return get_turf(L)
log_debug("Ghostspawner: Spawner [short_name] has neither spawnpoints nor landmarks or a matching spawnpoint/landmark could not be found")
return null //If we dont have anything return null
//The proc to actually spawn in the user
/datum/ghostspawner/proc/spawn_mob(mob/user)
//OVERWRITE THIS IN THE CHILD IMPLEMENTATIONS to return the spawned in mob !!!
return null
//Proc executed after someone is spawned in
/datum/ghostspawner/proc/post_spawn(mob/user)
if(max_count && count >= max_count)
disable()
if(welcome_message)
to_chat(user, span("notice", welcome_message))
return TRUE
//Proc to check if a specific user can edit this spawner (open/close/...)
/datum/ghostspawner/proc/can_edit(mob/user)
if(check_rights(req_perms_edit, show_msg=FALSE, user=user))
return TRUE
return FALSE
/datum/ghostspawner/proc/is_enabled()
if(max_count)
return enabled && count < max_count
return enabled
//Proc to enable the ghostspawner
/datum/ghostspawner/proc/enable()
enabled = TRUE
if(enable_dmessage)
for(var/mob/abstract/observer/O in player_list)
if(O.client && !cant_see(O))
if(enable_dmessage == TRUE)
to_chat(O, "<span class='deadsay'><b>A ghostspawner for a \"[src.name]\" has been enabled.</b></span>")
else
to_chat(O, "<span class='deadsay'><b>[enable_dmessage]</b></span>")
for(var/i in spawnpoints)
SSghostroles.update_spawnpoint_status_by_identifier(i)
return TRUE
//Proc to disable the ghostspawner
/datum/ghostspawner/proc/disable()
enabled = FALSE
for(var/i in SSghostroles.spawnpoints)
SSghostroles.update_spawnpoint_status_by_identifier(i)
return TRUE
/datum/ghostspawner/simplemob/spawn_mob(mob/user)
//Select a spawnpoint (if available)
var/turf/T = select_spawnpoint()
var/mob/living/simple_animal/S
if (T)
S = new spawn_mob(T)
else
to_chat(user, "<span class='warning'>Unable to find any spawn point. </span>")
if(S)
announce_ghost_joinleave(user, 0, "They are now a [name].")
S.ckey = user.ckey
return S