diff --git a/code/controllers/subsystems/job.dm b/code/controllers/subsystems/job.dm
index 3bdfef5464a..92e4c6adcb6 100644
--- a/code/controllers/subsystems/job.dm
+++ b/code/controllers/subsystems/job.dm
@@ -97,6 +97,8 @@ SUBSYSTEM_DEF(jobs)
return FALSE
if(jobban_isbanned(player, rank))
return FALSE
+ if(!player.IsJobAvailable(rank))
+ return FALSE
if(!(player.client.prefs.GetPlayerAltTitle(job) in player.client.prefs.GetValidTitles(job)))
to_chat(player, "Your character is too young!")
@@ -111,6 +113,7 @@ SUBSYSTEM_DEF(jobs)
player.mind.role_alt_title = GetPlayerAltTitle(player, rank)
unassigned -= player
job.current_positions++
+ job.pre_spawn(player)
return TRUE
Debug("AR has failed, Player: [player], Rank: [rank]")
return FALSE
@@ -119,7 +122,6 @@ SUBSYSTEM_DEF(jobs)
var/datum/job/job = GetJob(rank)
if(!istype(job))
return
-
job.current_positions--
/datum/controller/subsystem/jobs/proc/FindOccupationCandidates(datum/job/job, level, flag)
@@ -327,7 +329,7 @@ SUBSYSTEM_DEF(jobs)
Debug("ER/([H]): Equipping custom loadout.")
job.pre_equip(H)
job.setup_account(H)
-
+ job.after_spawn(H)
EquipCustom(H, job, H.client.prefs, custom_equip_leftovers, spawn_in_storage, custom_equip_slots)
job.equip(H)
@@ -635,10 +637,10 @@ SUBSYSTEM_DEF(jobs)
//Handle job slot/tater cleanup.
if (H.mind)
- var/job = H.mind.assigned_role
-
- FreeRole(job)
-
+ var/role = H.mind.assigned_role
+ var/datum/job/job = GetJob(H.mind.assigned_role)
+ job.on_despawn(H)
+ FreeRole(role)
if(H.mind.objectives.len)
qdel(H.mind.objectives)
H.mind.special_role = null
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index b114fbb5393..c80d71b54dd 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -42,10 +42,17 @@
var/datum/outfit/outfit = null
var/list/alt_outfits = null // A list of special outfits for the alt titles list("alttitle" = /datum/outfit)
var/list/blacklisted_species = null // A blacklist of species that can't be this job
+ var/list/blacklisted_citizenship = list() //A blacklist of citizenships that can't be this job
//Only override this proc
+/datum/job/proc/pre_spawn(mob/abstract/new_player/player)
+ return
+
/datum/job/proc/after_spawn(mob/living/carbon/human/H)
+/datum/job/proc/on_despawn(mob/living/carbon/human/H)
+ return
+
/datum/job/proc/announce(mob/living/carbon/human/H)
/datum/job/proc/get_outfit(mob/living/carbon/human/H, alt_title=null)
diff --git a/code/game/jobs/job/outsider/representative.dm b/code/game/jobs/job/outsider/representative.dm
index 7d491554025..0b01d9ada0c 100644
--- a/code/game/jobs/job/outsider/representative.dm
+++ b/code/game/jobs/job/outsider/representative.dm
@@ -26,6 +26,18 @@
outfit = /datum/outfit/job/representative
blacklisted_species = list(SPECIES_VAURCA_BULWARK, SPECIES_VAURCA_BREEDER)
+/datum/job/consular/pre_spawn(mob/abstract/new_player/player)
+ var/datum/faction/faction = SSjobs.name_factions[player.client.prefs.faction]
+ LAZYREMOVE(faction.allowed_role_types, REPRESENTATIVE_ROLE)
+
+/datum/job/representative/after_spawn(mob/living/carbon/human/H)
+ var/datum/faction/faction = SSjobs.GetFaction(H)
+ LAZYREMOVE(faction.allowed_role_types, REPRESENTATIVE_ROLE)
+
+/datum/job/representative/on_despawn(mob/living/carbon/human/H)
+ var/datum/faction/faction = SSjobs.GetFaction(H)
+ LAZYADD(faction.allowed_role_types, REPRESENTATIVE_ROLE)
+
/datum/outfit/job/representative
name = "NanoTrasen Corporate Liaison"
var/fax_department = "Representative's Office"
@@ -116,6 +128,7 @@
minimal_access = list(access_consular)
outfit = /datum/outfit/job/representative/consular
blacklisted_species = list(SPECIES_VAURCA_BULWARK)
+ blacklisted_citizenship = list(CITIZENSHIP_SOL, CITIZENSHIP_ERIDANI, CITIZENSHIP_ELYRA_NCP, CITIZENSHIP_NONE, CITIZENSHIP_FREE_COUNCIL)
/datum/job/consular/get_outfit(mob/living/carbon/human/H, alt_title = null)
var/datum/citizenship/citizenship = SSrecords.citizenships[H.citizenship]
@@ -142,3 +155,15 @@
if(citizenship)
rep_objectives = citizenship.get_objectives(mission_level, H)
return rep_objectives
+
+/datum/job/consular/pre_spawn(mob/abstract/new_player/player)
+ var/datum/citizenship/citizenship = SSrecords.citizenships[player.client.prefs.citizenship]
+ LAZYADD(blacklisted_citizenship, citizenship.name)
+
+/datum/job/consular/after_spawn(mob/living/carbon/human/H)
+ var/datum/citizenship/citizenship = SSrecords.citizenships[H.citizenship]
+ LAZYADD(blacklisted_citizenship, citizenship.name)
+
+/datum/job/consular/on_despawn(mob/living/carbon/human/H)
+ var/datum/citizenship/citizenship = SSrecords.citizenships[H.citizenship]
+ LAZYREMOVE(blacklisted_citizenship, citizenship.name)
diff --git a/code/modules/client/preference_setup/occupation/occupation.dm b/code/modules/client/preference_setup/occupation/occupation.dm
index 29ec01b41cc..8d48b4a6495 100644
--- a/code/modules/client/preference_setup/occupation/occupation.dm
+++ b/code/modules/client/preference_setup/occupation/occupation.dm
@@ -196,6 +196,10 @@
if(C.job_species_blacklist[job.title] && (pref.species in C.job_species_blacklist[job.title]))
dat += "[dispRank]