Skip to content

Commit

Permalink
Merge remote-tracking branch 'cmss13-devs/master' into project/ares/a…
Browse files Browse the repository at this point in the history
…dmin_console
  • Loading branch information
realforest2001 committed Aug 18, 2023
2 parents e0d7378 + 0f8c073 commit c2e3595
Show file tree
Hide file tree
Showing 44 changed files with 859 additions and 662 deletions.
2 changes: 1 addition & 1 deletion code/__DEFINES/mode.dm
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ var/global/list/whitelist_hierarchy = list(WHITELIST_NORMAL, WHITELIST_COUNCIL,

#define WHITELIST_EVERYTHING (WHITELISTS_GENERAL|WHITELISTS_COUNCIL|WHITELISTS_LEADER)

#define isCouncil(A) (RoleAuthority.roles_whitelist[A.ckey] & (WHITELIST_YAUTJA_COUNCIL | WHITELIST_SYNTHETIC_COUNCIL | WHITELIST_COMMANDER_COUNCIL))
#define isCouncil(A) (RoleAuthority.roles_whitelist[A.ckey] & WHITELIST_YAUTJA_COUNCIL) || (RoleAuthority.roles_whitelist[A.ckey] & WHITELIST_SYNTHETIC_COUNCIL) || (RoleAuthority.roles_whitelist[A.ckey] & WHITELIST_COMMANDER_COUNCIL)

//=================================================

Expand Down
3 changes: 3 additions & 0 deletions code/__DEFINES/traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,8 @@
#define TRAIT_INTENT_EYES "t_intent_eyes"
/// Masked synthetic biology. Basic medHUDs will percieve the mob as human. (Infiltrator Synths)
#define TRAIT_INFILTRATOR_SYNTH "t_infiltrator_synth"
/// Makes it impossible to strip the inventory of this mob.
#define TRAIT_UNSTRIPPABLE "t_unstrippable"

// HIVE TRAITS
/// If the Hive is a Xenonid Hive
Expand Down Expand Up @@ -251,6 +253,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_FOREIGN_BIO" = TRAIT_FOREIGN_BIO,
"TRAIT_INTENT_EYES" = TRAIT_INTENT_EYES,
"TRAIT_INFILTRATOR_SYNTH" = TRAIT_INFILTRATOR_SYNTH,
"TRAIT_UNSTRIPPABLE" = TRAIT_UNSTRIPPABLE,
"TRAIT_NESTED" = TRAIT_NESTED,
"TRAIT_CRAWLER" = TRAIT_CRAWLER,
"TRAIT_SIMPLE_DESC" = TRAIT_SIMPLE_DESC,
Expand Down
2 changes: 2 additions & 0 deletions code/controllers/configuration/entries/general.dm
Original file line number Diff line number Diff line change
Expand Up @@ -621,3 +621,5 @@ This maintains a list of ip addresses that are able to bypass topic filtering.
/datum/config_entry/string/instance_name
config_entry_value = "game"
protection = CONFIG_ENTRY_HIDDEN|CONFIG_ENTRY_LOCKED

/datum/config_entry/flag/guest_ban
12 changes: 5 additions & 7 deletions code/datums/diseases/black_goo.dm
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@
icon = 'icons/mob/humans/species/r_zombie.dmi'
icon_state = "claw_l"
flags_item = NODROP|DELONDROP|ITEM_ABSTRACT
force = 40
force = MELEE_FORCE_TIER_6 //slightly higher than normal
w_class = SIZE_MASSIVE
sharp = 1
attack_verb = list("slashed", "torn", "scraped", "gashed", "ripped")
Expand All @@ -135,8 +135,9 @@
return FALSE

. = ..()
if(.)
playsound(loc, 'sound/weapons/bladeslice.ogg', 25, 1, 5)
if(!.)
return FALSE
playsound(loc, 'sound/weapons/bladeslice.ogg', 25, 1, 5)

if(ishuman_strict(target))
var/mob/living/carbon/human/human = target
Expand All @@ -149,10 +150,7 @@
target.AddDisease(new /datum/disease/black_goo)
to_chat(user, SPAN_XENOWARNING("<b>You sense your target is now infected.</b>"))

if(issynth(target))
target.apply_effect(2, SLOW)
else
target.apply_effect(2, SUPERSLOW)
target.apply_effect(2, SLOW)

/obj/item/weapon/zombie_claws/afterattack(obj/O as obj, mob/user as mob, proximity)
if(get_dist(src, O) > 1)
Expand Down
86 changes: 50 additions & 36 deletions code/datums/emergency_calls/cryo_marines.dm
Original file line number Diff line number Diff line change
Expand Up @@ -12,65 +12,79 @@
name_of_spawn = /obj/effect/landmark/ert_spawns/distress_cryo
shuttle_id = ""
var/leaders = 0
spawn_max_amount = TRUE

/datum/emergency_call/cryo_squad/spawn_candidates(announce, override_spawn_loc, announce_dispatch_message)
var/datum/squad/marine/cryo/cryo_squad = RoleAuthority.squads_by_type[/datum/squad/marine/cryo]
leaders = cryo_squad.num_leaders
. = ..()
if(length(members))
shipwide_ai_announcement("Successfully deployed [length(members)] Foxtrot marines.")
shipwide_ai_announcement("Successfully deployed [mob_max] Foxtrot marines, of which [length(members)] are ready for duty.")
if(mob_max > length(members))
announce_dchat("Some cryomarines were not taken, use the Join As Freed Mob verb to take one of them.")

/datum/emergency_call/cryo_squad/create_member(datum/mind/M, turf/override_spawn_loc)
/datum/emergency_call/cryo_squad/create_member(datum/mind/mind, turf/override_spawn_loc)
set waitfor = 0
if(SSmapping.configs[GROUND_MAP].map_name == MAP_WHISKEY_OUTPOST)
name_of_spawn = /obj/effect/landmark/ert_spawns/distress_wo
var/turf/spawn_loc = override_spawn_loc ? override_spawn_loc : get_spawn_point()

if(!istype(spawn_loc)) return //Didn't find a useable spawn point.

var/mob/living/carbon/human/H = new(spawn_loc)
M.transfer_to(H, TRUE)
var/mob/living/carbon/human/human = new(spawn_loc)

if(mind)
mind.transfer_to(human, TRUE)
else
human.create_hud()

if(!mind)
for(var/obj/structure/machinery/cryopod/pod in view(7,human))
if(pod && !pod.occupant)
pod.go_in_cryopod(human, silent = TRUE)
break

sleep(5)
var/datum/squad/marine/cryo/cryo_squad = RoleAuthority.squads_by_type[/datum/squad/marine/cryo]
if(leaders < cryo_squad.max_leaders && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(H.client, JOB_SQUAD_LEADER, time_required_for_job))
leader = H
if(leaders < cryo_squad.max_leaders && (!mind || (HAS_FLAG(human.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(human.client, JOB_SQUAD_LEADER, time_required_for_job))))
leader = human
leaders++
H.client.prefs.copy_all_to(H, JOB_SQUAD_LEADER, TRUE, TRUE)
arm_equipment(H, /datum/equipment_preset/uscm/leader/cryo, FALSE, TRUE)
to_chat(H, SPAN_ROLE_HEADER("You are a Squad Leader in the USCM"))
to_chat(H, SPAN_ROLE_BODY("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
to_chat(H, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced."))
else if (heavies < max_heavies && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_HEAVY) && check_timelock(H.client, JOB_SQUAD_SPECIALIST, time_required_for_job))
human.client?.prefs.copy_all_to(human, JOB_SQUAD_LEADER, TRUE, TRUE)
arm_equipment(human, /datum/equipment_preset/uscm/leader/cryo, mind == null, TRUE)
to_chat(human, SPAN_ROLE_HEADER("You are a Squad Leader in the USCM"))
to_chat(human, SPAN_ROLE_BODY("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
to_chat(human, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced."))
else if (heavies < max_heavies && (!mind || (HAS_FLAG(human.client.prefs.toggles_ert, PLAY_HEAVY) && check_timelock(human.client, JOB_SQUAD_SPECIALIST, time_required_for_job))))
heavies++
H.client.prefs.copy_all_to(H, JOB_SQUAD_SPECIALIST, TRUE, TRUE)
arm_equipment(H, /datum/equipment_preset/uscm/spec/cryo, FALSE, TRUE)
to_chat(H, SPAN_ROLE_HEADER("You are a Weapons Specialist in the USCM"))
to_chat(H, SPAN_ROLE_BODY("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
to_chat(H, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced."))
else if (medics < max_medics && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(H.client, JOB_SQUAD_MEDIC, time_required_for_job))
human.client?.prefs.copy_all_to(human, JOB_SQUAD_SPECIALIST, TRUE, TRUE)
arm_equipment(human, /datum/equipment_preset/uscm/spec/cryo, mind == null, TRUE)
to_chat(human, SPAN_ROLE_HEADER("You are a Weapons Specialist in the USCM"))
to_chat(human, SPAN_ROLE_BODY("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
to_chat(human, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced."))
else if (medics < max_medics && (!mind || (HAS_FLAG(human.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(human.client, JOB_SQUAD_MEDIC, time_required_for_job))))
medics++
H.client.prefs.copy_all_to(H, JOB_SQUAD_MEDIC, TRUE, TRUE)
arm_equipment(H, /datum/equipment_preset/uscm/medic/cryo, FALSE, TRUE)
to_chat(H, SPAN_ROLE_HEADER("You are a Hospital Corpsman in the USCM"))
to_chat(H, SPAN_ROLE_BODY("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
to_chat(H, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced."))
else if (engineers < max_engineers && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_ENGINEER) && check_timelock(H.client, JOB_SQUAD_ENGI, time_required_for_job))
human.client?.prefs.copy_all_to(human, JOB_SQUAD_MEDIC, TRUE, TRUE)
arm_equipment(human, /datum/equipment_preset/uscm/medic/cryo, mind == null, TRUE)
to_chat(human, SPAN_ROLE_HEADER("You are a Hospital Corpsman in the USCM"))
to_chat(human, SPAN_ROLE_BODY("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
to_chat(human, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced."))
else if (engineers < max_engineers && (!mind || (HAS_FLAG(human.client.prefs.toggles_ert, PLAY_ENGINEER) && check_timelock(human.client, JOB_SQUAD_ENGI, time_required_for_job))))
engineers++
H.client.prefs.copy_all_to(H, JOB_SQUAD_ENGI, TRUE, TRUE)
arm_equipment(H, /datum/equipment_preset/uscm/engineer/cryo, FALSE, TRUE)
to_chat(H, SPAN_ROLE_HEADER("You are an Engineer in the USCM"))
to_chat(H, SPAN_ROLE_BODY("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
to_chat(H, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced."))
human.client?.prefs.copy_all_to(human, JOB_SQUAD_ENGI, TRUE, TRUE)
arm_equipment(human, /datum/equipment_preset/uscm/engineer/cryo, mind == null, TRUE)
to_chat(human, SPAN_ROLE_HEADER("You are an Engineer in the USCM"))
to_chat(human, SPAN_ROLE_BODY("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
to_chat(human, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced."))
else
H.client.prefs.copy_all_to(H, JOB_SQUAD_MARINE, TRUE, TRUE)
arm_equipment(H, /datum/equipment_preset/uscm/pfc/cryo, FALSE, TRUE)
to_chat(H, SPAN_ROLE_HEADER("You are a Rifleman in the USCM"))
to_chat(H, SPAN_ROLE_BODY("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
to_chat(H, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced."))
human.client?.prefs.copy_all_to(human, JOB_SQUAD_MARINE, TRUE, TRUE)
arm_equipment(human, /datum/equipment_preset/uscm/pfc/cryo, mind == null, TRUE)
to_chat(human, SPAN_ROLE_HEADER("You are a Rifleman in the USCM"))
to_chat(human, SPAN_ROLE_BODY("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
to_chat(human, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced."))

sleep(10)
to_chat(H, SPAN_BOLD("Objectives: [objectives]"))
if(!mind)
human.free_for_ghosts()
to_chat(human, SPAN_BOLD("Objectives: [objectives]"))

/datum/emergency_call/cryo_squad/platoon
name = "Marine Cryo Reinforcements (Platoon)"
Expand Down
20 changes: 15 additions & 5 deletions code/datums/medal_awards.dm
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,10 @@ GLOBAL_LIST_EMPTY(jelly_awards)
var/recipient_rank
var/recipient_ckey
var/mob/recipient_mob
var/list/giver_name // Actually key for xenos
var/list/giver_rank // Actually name for xenos
var/list/giver_name // Designation for xenos
var/list/giver_rank // "Name" for xenos
var/list/giver_mob
var/list/giver_ckey

/datum/recipient_awards/New()
medal_names = list()
Expand All @@ -32,6 +33,7 @@ GLOBAL_LIST_EMPTY(jelly_awards)
giver_name = list()
giver_rank = list()
giver_mob = list()
giver_ckey = list()


/proc/give_medal_award(medal_location, as_admin = FALSE)
Expand Down Expand Up @@ -116,12 +118,13 @@ GLOBAL_LIST_EMPTY(jelly_awards)
recipient_award.medal_names += medal_type
recipient_award.medal_citations += citation
recipient_award.posthumous += posthumous
recipient_award.giver_ckey += usr.ckey

if(!as_admin)
recipient_award.giver_rank += recipient_ranks[usr.real_name] // Currently not used in marine award message
recipient_award.giver_name += usr.real_name // Currently not used in marine award message
else
recipient_award.giver_rank += "([usr.ckey])" // Just because it'll be displayed in the panel
recipient_award.giver_rank += null
recipient_award.giver_name += null

// Create an actual medal item
Expand Down Expand Up @@ -258,15 +261,21 @@ GLOBAL_LIST_EMPTY(jelly_awards)
recipient_award.medal_names += medal_type
recipient_award.medal_citations += citation
recipient_award.posthumous += posthumous
recipient_award.giver_ckey += usr.ckey

if(!admin_attribution)
recipient_award.giver_rank += usr.name
recipient_award.giver_name += usr.key
var/mob/living/carbon/xenomorph/giving_xeno = usr
if(istype(giving_xeno))
recipient_award.giver_name += giving_xeno.full_designation
else
recipient_award.giver_name += null
else if(admin_attribution == "none")
recipient_award.giver_rank += null
recipient_award.giver_name += null
else
recipient_award.giver_rank += admin_attribution
recipient_award.giver_name += null // If not null, rescinding it will take stats away from a mob with this key
recipient_award.giver_name += null

recipient_award.medal_items += null // TODO: Xeno award item?

Expand Down Expand Up @@ -337,6 +346,7 @@ GLOBAL_LIST_EMPTY(jelly_awards)
recipient_award.giver_name.Cut(index, index + 1)
recipient_award.giver_rank.Cut(index, index + 1)
recipient_award.giver_mob.Cut(index, index + 1)
recipient_award.giver_ckey.Cut(index, index + 1)
recipient_award.medal_items.Cut(index, index + 1)

// Remove giver's stat
Expand Down
2 changes: 1 addition & 1 deletion code/datums/redis/callbacks/asay.dm
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
var/msg = SPAN_MOD("<span class='prefix'>[data["rank"]]:</span> <EM>[data["author"]]@[data["source"]]</EM>: <span class='message'>[strip_html(data["message"])]</span>")

for(var/client/client in GLOB.admins)
if(!(R_MOD|R_ADMIN & client.admin_holder.rights))
if(!(R_ADMIN & client.admin_holder.rights) && !(R_MOD & client.admin_holder.rights))
continue

to_chat(client, msg)
2 changes: 2 additions & 0 deletions code/datums/statistics/random_facts/random_fact.dm
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@
list_to_check += GLOB.living_xeno_list

for(var/mob/checked_mob as anything in list_to_check)
if(!checked_mob?.persistent_ckey)
continue // We don't care about NPCs
if(living_stat_gotten < life_grab_stat(checked_mob))
mob_to_report = checked_mob
living_stat_gotten = life_grab_stat(checked_mob)
Expand Down
2 changes: 1 addition & 1 deletion code/game/gamemodes/cm_initialize.dm
Original file line number Diff line number Diff line change
Expand Up @@ -969,7 +969,7 @@ Additional game mode variables.
log_debug("Null client attempted to transform_joe")
return

var/turf/spawn_point = get_turf(pick(GLOB.latejoin))
var/turf/spawn_point = get_turf(pick(GLOB.latejoin_by_job[JOB_WORKING_JOE]))
var/mob/living/carbon/human/synthetic/new_joe = new(spawn_point)
joe_candidate.mind.transfer_to(new_joe, TRUE)
var/datum/job/joe_job = RoleAuthority.roles_by_name[JOB_WORKING_JOE]
Expand Down
2 changes: 1 addition & 1 deletion code/game/machinery/cryopod.dm
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ GLOBAL_LIST_INIT(frozen_items, list(SQUAD_MARINE_1 = list(), SQUAD_MARINE_2 = li

//Lifted from Unity stasis.dm and refactored. ~Zuhayr
/obj/structure/machinery/cryopod/process()
if(occupant)
if(occupant && !(WEAKREF(occupant) in GLOB.freed_mob_list)) //ignore freed mobs
//if occupant ghosted, time till despawn is severely shorter
if(!occupant.key && time_till_despawn == 10 MINUTES)
time_till_despawn -= 8 MINUTES
Expand Down
2 changes: 1 addition & 1 deletion code/game/objects/effects/decals/cleanable/misc.dm
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@
/obj/effect/decal/cleanable/blackgoo/Crossed(mob/living/carbon/human/H)
if(!istype(H)) return
if(H.species.name == "Human")
if(!H.shoes || prob(25))
if(!H.shoes && prob(50))
H.contract_disease(new /datum/disease/black_goo)


Expand Down
5 changes: 4 additions & 1 deletion code/game/objects/items/backpack_sprayers.dm
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
w_class = SIZE_LARGE
flags_equip_slot = SLOT_BACK
flags_atom = OPENCONTAINER
possible_transfer_amounts = null//no point giving it possibility when mister can't it just confuse people
volume = 500
var/fill_reagent = "water"
var/spawn_empty = FALSE
Expand Down Expand Up @@ -83,8 +84,10 @@
/obj/item/reagent_container/glass/watertank/verb/toggle_mister_verb()
set name = "Toggle Mister"
set category = "Object"
set src in usr
toggle_mister(usr)


/obj/item/reagent_container/glass/watertank/MouseDrop(obj/over_object as obj)
if(!CAN_PICKUP(usr, src))
return ..()
Expand Down Expand Up @@ -132,7 +135,7 @@
item_state = "nozzle"
w_class = SIZE_LARGE
flags_equip_slot = null
amount_per_transfer_from_this = 50
amount_per_transfer_from_this = 5
possible_transfer_amounts = null
spray_size = 5
volume = 500
Expand Down
7 changes: 0 additions & 7 deletions code/game/objects/structures/props.dm
Original file line number Diff line number Diff line change
Expand Up @@ -1016,13 +1016,6 @@
icon_state = "arcadeb"
name = "Spirit Phone, The Game, The Movie: II"

/obj/structure/prop/maintenance_hatch
name = "\improper Maintenance Hatch"
icon = 'icons/obj/structures/structures.dmi'
icon_state = "hatchclosed"
desc = "Looks like it's rusted shut. Creepy."
layer = HATCH_LAYER

//INVULNERABLE PROPS

/obj/structure/prop/invuln
Expand Down
32 changes: 23 additions & 9 deletions code/game/verbs/ooc.dm
Original file line number Diff line number Diff line change
Expand Up @@ -57,24 +57,38 @@
display_colour = CONFIG_GET(string/ooc_color_default)

msg = process_chat_markup(msg, list("*"))

var/ooc_prefix = handle_ooc_prefix()
for(var/client/C in GLOB.clients)
if(C.prefs.toggles_chat & CHAT_OOC)
var/display_name = src.key
if(prefs.unlock_content)
if(prefs.toggle_prefs & TOGGLE_MEMBER_PUBLIC)
var/byond = icon('icons/effects/effects.dmi', "byondlogo")
display_name = "[icon2html(byond, GLOB.clients)][display_name]"
if(CONFIG_GET(flag/ooc_country_flags))
if(prefs.toggle_prefs & TOGGLE_OOC_FLAG)
display_name = "[country2chaticon(src.country, GLOB.clients)][display_name]"
to_chat(C, "<font color='[display_colour]'><span class='ooc linkify'>[src.donator ? "\[D\] " : ""]<span class='prefix'>OOC: [display_name]</span>: <span class='message'>[msg]</span></span></font>")
to_chat(C, "<font color='[display_colour]'><span class='ooc linkify'>[ooc_prefix]<span class='prefix'>OOC: [display_name]</span>: <span class='message'>[msg]</span></span></font>")

/client/proc/set_ooc_color_global(newColor as color)
set name = "OOC Text Color - Global"
set desc = "Set to yellow for eye burning goodness."
set category = "OOC.OOC"
GLOB.ooc_color_override = newColor

///Used by OOC chat to generate icons for player prefix. Intended to make it easy to see at a glance if someone is staff, WL Council or Mentor.
/client/proc/handle_ooc_prefix()
var/prefix = ""
if(prefs.unlock_content && (prefs.toggle_prefs & TOGGLE_MEMBER_PUBLIC))
var/byond = icon('icons/effects/effects.dmi', "byondlogo")
prefix += "[icon2html(byond, GLOB.clients)]"
if(CONFIG_GET(flag/ooc_country_flags) && (prefs.toggle_prefs & TOGGLE_OOC_FLAG))
prefix += "[country2chaticon(src.country, GLOB.clients)]"
if(donator)
prefix += "[icon2html('icons/ooc.dmi', GLOB.clients, "Donator")]"
if(isCouncil(src))
prefix += "[icon2html('icons/ooc.dmi', GLOB.clients, "WhitelistCouncil")]"
if(admin_holder)
var/list/rank_icons = icon_states('icons/ooc.dmi')
var/rankname = admin_holder.rank
if(rankname in rank_icons)
prefix += "[icon2html('icons/ooc.dmi', GLOB.clients, admin_holder.rank)]"
if(prefix)
prefix = "[prefix] "
return prefix

/client/verb/looc(msg as text)
set name = "LOOC" //Gave this shit a shorter name so you only have to time out "ooc" rather than "ooc message" to use it --NeoFite
Expand Down
1 change: 1 addition & 0 deletions code/global.dm
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@

#define CLIENT_HAS_RIGHTS(cli, flags) ((cli?.admin_holder?.rights & flags) == flags)
#define CLIENT_IS_STAFF(cli) (cli?.admin_holder?.rights & (R_MOD|R_ADMIN))
#define CLIENT_IS_MENTOR(cli) CLIENT_HAS_RIGHTS(cli, R_MENTOR)

#define AHOLD_IS_MOD(ahold) (ahold && (ahold.rights & R_MOD))
#define AHOLD_IS_ADMIN(ahold) (ahold && (ahold.rights & R_ADMIN))
Expand Down
Loading

0 comments on commit c2e3595

Please sign in to comment.