Files

250 lines
6.8 KiB
Plaintext

/obj/landmark/spawnpoint
name = "unknown spawnpoint"
icon = 'icons/mapping/landmarks/spawnpoints.dmi'
icon_state = ""
/// prevent stacking of mobs
var/prevent_mob_stack = TRUE
/// Spawns left
var/spawns_left = INFINITY
/// Number of spawns currently
var/spawned = 0
/// Delete on depletion
var/delete_after_depleted = FALSE
/// Priority - landmark is binary inserted on register/unregister. Lower numbers are higher priority.
var/priority = 0
/// default spawn announce text - allowed are %NAME%, %JOB% - for more complex, override RenderAnnounceMessage()
var/announce_template = "%NAME%, %JOB% will arrive shortly."
/obj/landmark/spawnpoint/Initialize(mapload)
Register()
return ..()
/obj/landmark/spawnpoint/Destroy()
Unregister()
return ..()
/obj/landmark/spawnpoint/forceMove(atom/destination)
Unregister()
. = ..()
Register()
/obj/landmark/spawnpoint/vv_edit_var(var_name, var_value, massedit)
if(var_name == NAMEOF(src, priority))
Unregister()
. = ..()
if(var_name == NAMEOF(src, priority))
Register()
/obj/landmark/spawnpoint/proc/Register()
SHOULD_CALL_PARENT(TRUE)
SSjob.spawnpoints += src
/obj/landmark/spawnpoint/proc/Unregister()
SHOULD_CALL_PARENT(TRUE)
SSjob.spawnpoints -= src
/obj/landmark/spawnpoint/proc/AutoListRegister(list/L)
if(src in L)
return
BINARY_INSERT(src, L, /obj/landmark/spawnpoint, src, priority, COMPARE_KEY)
/obj/landmark/spawnpoint/proc/AutoListUnregister(list/L)
if(!L)
return
L -= src
/**
* Gets the spawn location of this spawnpoint
* This should usually be underneath it, as this is where the mob will be created/moved.
*/
/obj/landmark/spawnpoint/proc/GetSpawnLoc()
if(!loc)
stack_trace("Landmark: Null loc detected on GetSpawnLoc().")
return loc
/**
* Called after the mob is created/moved to the spawnpoint.
*
* @params
* - M - the mob that was spawned
* - C - (optional) - the client of the player
*/
/obj/landmark/spawnpoint/proc/OnSpawn(mob/M, client/C)
spawns_left = max(0, spawns_left - 1)
++spawned
/**
* Called to check if this spawnpoint is available for a certain mob and client
*
* @params
* - M - (optional) - the mob being spawned. This is null during latejoins and other instances where the mob is
* made when there is a spawnpoint, as opposed to roundstart creating all mobs at once
* - C - (optional) - the client of the player
* - harder - ignore checks like prevent_mob_stack
*/
/obj/landmark/spawnpoint/proc/Available(mob/M, client/C, harder = FALSE)
if(!spawns_left)
return FALSE
if(prevent_mob_stack && M && !harder)
if(ishuman(M) && (locate(/mob/living/carbon/human) in GetSpawnLoc()))
return FALSE
else if(locate(M.type) in GetSpawnLoc())
return FALSE
return TRUE
/**
* Used first priority for job spawning
*/
/obj/landmark/spawnpoint/job
name = "unknown job spawnpoint"
icon = 'icons/mapping/landmarks/job_spawnpoints.dmi'
spawns_left = 1
/// Job path
var/job_path
/// Roundstart?
var/roundstart = TRUE
/// Latejoin?
var/latejoin = FALSE
/// Latejoin method - if there's more than one registered method available, a player may choose which one to use
var/method = LATEJOIN_METHOD_DEFAULT
/// Overrides all latejoin spawnpoints even if methods mismatch
var/latejoin_override = FALSE
/obj/landmark/spawnpoint/job/Register()
. = ..()
if(!job_path)
return
LAZYINITLIST(SSjob.job_spawnpoints)
LAZYINITLIST(SSjob.job_spawnpoints[job_path])
AutoListRegister(SSjob.job_spawnpoints[job_path])
/obj/landmark/spawnpoint/job/Unregister()
. = ..()
if(!job_path)
return
AutoListUnregister(SSjob.job_spawnpoints[job_path])
/**
* renders a html message for someone joining
* usually only called on latejoining
*
* @params
* M - mob
* C - client (optional)
* J - job datum instance (optional)
* name - spawnee's name
* job_name - job's name - useful for alt titles
*/
/obj/landmark/spawnpoint/proc/RenderAnnounceMessage(mob/M, client/C, datum/prototype/role/job/J, name, job_name)
return "[name || "Unknown"] will arrive shortly."
/**
* special announce proc - text usually broadcasted is sent here, raw, from RenderAnnounceMessage
*
* if this returns TRUE, regular announce is skipped.
*/
/obj/landmark/spawnpoint/proc/OverrideAnnounceMessage(raw)
return !length(announce_template) // by default, if announce template is empty, this will prevent announce!
/obj/landmark/spawnpoint/job/vv_edit_var(var_name, var_value, massedit)
if(var_name == NAMEOF(src, job_path))
Register()
. = ..()
if(var_name == NAMEOF(src, job_path))
Unregister()
/**
* Used when there's no job specific latejoin spawnpoints
*/
/obj/landmark/spawnpoint/latejoin
name = "unknown latejoin spawnpoint"
/// Faction
var/faction
/// Method - if there's more than one registered method available, a player may choose which one to use
var/method = LATEJOIN_METHOD_DEFAULT
/obj/landmark/spawnpoint/latejoin/Register()
. = ..()
if(!faction)
return
LAZYINITLIST(SSjob.latejoin_spawnpoints)
LAZYINITLIST(SSjob.latejoin_spawnpoints[faction])
AutoListRegister(SSjob.latejoin_spawnpoints[faction])
/obj/landmark/spawnpoint/latejoin/Unregister()
. = ..()
if(!faction)
return
AutoListUnregister(SSjob.latejoin_spawnpoints[faction])
/obj/landmark/spawnpoint/latejoin/vv_edit_var(var_name, var_value, massedit)
if(var_name == NAMEOF(src, faction))
Register()
. = ..()
if(var_name == NAMEOF(src, faction))
Unregister()
/obj/landmark/spawnpoint/latejoin/RenderAnnounceMessage(mob/M, client/C, name, job_name)
. = announce_template
. = replacetext(., "%NAME%", name)
. = replacetext(., "%JOB%", job_name)
/**
* Used when all other spawnpoints are unavailable
*/
/obj/landmark/spawnpoint/overflow
name = "unknown overflow spawnpoint"
/// Faction
var/faction
/obj/landmark/spawnpoint/overflow/Register()
. = ..()
if(!faction)
return
LAZYINITLIST(SSjob.overflow_spawnpoints)
LAZYINITLIST(SSjob.overflow_spawnpoints[faction])
AutoListRegister(SSjob.overflow_spawnpoints[faction])
/obj/landmark/spawnpoint/overflow/Unregister()
. = ..()
if(!faction)
return
AutoListUnregister(SSjob.overflow_spawnpoints[faction])
/obj/landmark/spawnpoint/overflow/vv_edit_var(var_name, var_value, massedit)
if(var_name == NAMEOF(src, faction))
Register()
. = ..()
if(var_name == NAMEOF(src, faction))
Unregister()
/**
* Custom keyed list spawnpoint supplier
*/
/obj/landmark/spawnpoint/custom
name = "unknown custom spawnpoint"
/// Key
var/key
/obj/landmark/spawnpoint/custom/Register()
. = ..()
if(!key)
return
LAZYINITLIST(SSjob.custom_spawnpoints)
LAZYINITLIST(SSjob.custom_spawnpoints[key])
AutoListRegister(SSjob.custom_spawnpoints[key])
/obj/landmark/spawnpoint/custom/Unregister()
. = ..()
if(!key)
return
AutoListUnregister(SSjob.custom_spawnpoints[key])
/obj/landmark/spawnpoint/custom/vv_edit_var(var_name, var_value, massedit)
if(var_name == NAMEOF(src, key))
Register()
. = ..()
if(var_name == NAMEOF(src, key))
Unregister()