mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-22 11:37:40 +01:00
Merge remote-tracking branch 'upstream/master' into weather-subsystem
# Conflicts: # code/__DEFINES/layers.dm
This commit is contained in:
@@ -93,7 +93,7 @@ world/IsBanned(key,address,computer_id)
|
||||
var/appealmessage = ""
|
||||
if(config.banappeals)
|
||||
appealmessage = " You may appeal it at <a href='[config.banappeals]'>[config.banappeals]</a>."
|
||||
expires = " The is a permanent ban.[appealmessage]"
|
||||
expires = " This is a permanent ban.[appealmessage]"
|
||||
|
||||
var/desc = "\nReason: You, or another user of this computer or connection ([pckey]) is banned from playing here. The ban reason is:\n[reason]\nThis ban was applied by [ackey] on [bantime].[expires]"
|
||||
|
||||
|
||||
@@ -868,10 +868,10 @@ var/list/admin_verbs_ticket = list(
|
||||
|
||||
switch(alert("Do you wish for [H] to be allowed to select non-whitelisted races?","Alter Mob Appearance","Yes","No","Cancel"))
|
||||
if("Yes")
|
||||
admin_log_and_message_admins("has allowed [H] to change \his appearance, without whitelisting of races.")
|
||||
admin_log_and_message_admins("has allowed [H] to change [H.p_their()] appearance, without whitelisting of races.")
|
||||
H.change_appearance(APPEARANCE_ALL, H.loc, check_species_whitelist = 0)
|
||||
if("No")
|
||||
admin_log_and_message_admins("has allowed [H] to change \his appearance, with whitelisting of races.")
|
||||
admin_log_and_message_admins("has allowed [H] to change [H.p_their()] appearance, with whitelisting of races.")
|
||||
H.change_appearance(APPEARANCE_ALL, H.loc, check_species_whitelist = 1)
|
||||
feedback_add_details("admin_verb","CMAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
|
||||
@@ -25,8 +25,6 @@
|
||||
<A href='?src=[UID()];secretsadmin=check_antagonist'>Show current traitors and objectives</A><BR>
|
||||
<a href='?src=[UID()];secretsadmin=night_shift_set'>Set Night Shift Mode</a><br>
|
||||
<B>Bombs</b><br>
|
||||
<A href='?src=[UID()];secretsadmin=list_bombers'>Bombing List</A>
|
||||
<A href='?src=[UID()];secretsadmin=clear_bombs'>Remove all bombs currently in existence</A>
|
||||
[check_rights(R_SERVER, 0) ? " <A href='?src=[UID()];secretsfun=togglebombcap'>Toggle bomb cap</A><br>" : "<br>"]
|
||||
<B>Lists</b><br>
|
||||
<A href='?src=[UID()];secretsadmin=list_signalers'>Show last [length(lastsignalers)] signalers</A>
|
||||
@@ -129,5 +127,3 @@
|
||||
var/datum/browser/popup = new(usr, "secrets", "<div align='center'>Admin Secrets</div>", 630, 670)
|
||||
popup.set_content(dat)
|
||||
popup.open(0)
|
||||
|
||||
|
||||
|
||||
@@ -104,7 +104,7 @@ var/global/datum/adminTicketHolder/globAdminTicketHolder = new /datum/adminTicke
|
||||
/datum/adminTicketHolder/proc/checkForTicket(var/client/C)
|
||||
var/list/tickets = list()
|
||||
for(var/datum/admin_ticket/T in allTickets)
|
||||
if(T.clientName == C && T.ticketState == ADMIN_TICKET_OPEN || T.ticketState == ADMIN_TICKET_STALE)
|
||||
if(T.clientName == C && (T.ticketState == ADMIN_TICKET_OPEN || T.ticketState == ADMIN_TICKET_STALE))
|
||||
tickets += T
|
||||
if(tickets.len)
|
||||
return tickets
|
||||
|
||||
@@ -1622,14 +1622,14 @@
|
||||
H.equip_to_slot_or_del( new /obj/item/reagent_containers/food/snacks/cookie(H), slot_r_hand )
|
||||
if(!(istype(H.r_hand,/obj/item/reagent_containers/food/snacks/cookie)))
|
||||
log_admin("[key_name(H)] has their hands full, so they did not receive their cookie, spawned by [key_name(src.owner)].")
|
||||
message_admins("[key_name_admin(H)] has their hands full, so they did not receive their cookie, spawned by [key_name_admin(src.owner)].")
|
||||
message_admins("[key_name_admin(H)] has [H.p_their()] hands full, so [H.p_they()] did not receive [H.p_their()] cookie, spawned by [key_name_admin(src.owner)].")
|
||||
return
|
||||
else
|
||||
H.update_inv_r_hand()//To ensure the icon appears in the HUD
|
||||
else
|
||||
H.update_inv_l_hand()
|
||||
log_admin("[key_name(H)] got their cookie, spawned by [key_name(src.owner)]")
|
||||
message_admins("[key_name_admin(H)] got their cookie, spawned by [key_name_admin(src.owner)]")
|
||||
message_admins("[key_name_admin(H)] got [H.p_their()] cookie, spawned by [key_name_admin(src.owner)]")
|
||||
feedback_inc("admin_cookies_spawned",1)
|
||||
to_chat(H, "<span class='notice'>Your prayers have been answered!! You received the <b>best cookie</b>!</span>")
|
||||
|
||||
@@ -1683,7 +1683,7 @@
|
||||
to_chat(usr, "The person you are trying to contact is not wearing a headset")
|
||||
return
|
||||
|
||||
var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from Centcomm", "")
|
||||
var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via [H.p_their()] headset.","Outgoing message from Centcomm", "")
|
||||
if(!input) return
|
||||
|
||||
to_chat(src.owner, "You sent [input] to [H] via a secure channel.")
|
||||
@@ -2045,7 +2045,7 @@
|
||||
if(!istype(H.l_ear, /obj/item/radio/headset) && !istype(H.r_ear, /obj/item/radio/headset))
|
||||
to_chat(usr, "The person you are trying to contact is not wearing a headset")
|
||||
return
|
||||
var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from The Syndicate", "")
|
||||
var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via [H.p_their()] headset.","Outgoing message from The Syndicate", "")
|
||||
if(!input)
|
||||
return
|
||||
to_chat(src.owner, "You sent [input] to [H] via a secure channel.")
|
||||
@@ -2061,7 +2061,7 @@
|
||||
to_chat(usr, "The person you are trying to contact is not wearing a headset")
|
||||
return
|
||||
|
||||
var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from HONKplanet", "")
|
||||
var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via [H.p_their()] headset.","Outgoing message from HONKplanet", "")
|
||||
if(!input) return
|
||||
|
||||
to_chat(src.owner, "You sent [input] to [H] via a secure channel.")
|
||||
@@ -2907,13 +2907,6 @@
|
||||
|
||||
var/ok = 0
|
||||
switch(href_list["secretsadmin"])
|
||||
if("clear_bombs")
|
||||
//I do nothing
|
||||
if("list_bombers")
|
||||
var/dat = "<B>Bombing List<HR>"
|
||||
for(var/l in bombers)
|
||||
dat += text("[l]<BR>")
|
||||
usr << browse(dat, "window=bombers")
|
||||
if("list_signalers")
|
||||
var/dat = "<B>Showing last [length(lastsignalers)] signalers.</B><HR>"
|
||||
for(var/sig in lastsignalers)
|
||||
@@ -3382,7 +3375,7 @@
|
||||
to_chat(hunter_mob, "<span class='danger'>ATTENTION:</span> You are now on a mission!")
|
||||
to_chat(hunter_mob, "<B>Goal: <span class='danger'>[killthem ? "MURDER" : "PROTECT"] [H.real_name]</span>, currently in [get_area(H.loc)]. </B>");
|
||||
if(killthem)
|
||||
to_chat(hunter_mob, "<B>If you kill them, they cannot be revived.</B>");
|
||||
to_chat(hunter_mob, "<B>If you kill [H.p_them()], [H.p_they()] cannot be revived.</B>");
|
||||
hunter_mob.mind.special_role = SPECIAL_ROLE_TRAITOR
|
||||
var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR]
|
||||
tatorhud.join_hud(hunter_mob)
|
||||
|
||||
@@ -183,6 +183,8 @@
|
||||
if(check_rights(R_ADMIN|R_MOD, 0, X.mob))
|
||||
to_chat(X, "<span class='boldnotice'>[type]: [key_name(src, TRUE, type)]->[key_name(C, TRUE, type)]: [emoji_msg]</span>")
|
||||
|
||||
if(type == "Mentorhelp")
|
||||
return
|
||||
//Check if the mob being PM'd has any open admin tickets.
|
||||
var/tickets = list()
|
||||
tickets = globAdminTicketHolder.checkForTicket(C)
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
if(check_rights(R_ADMIN,0))
|
||||
for(var/client/C in admins)
|
||||
if(R_ADMIN & C.holder.rights)
|
||||
msg = "<span class='emoji_enabled'>[msg]</span>"
|
||||
to_chat(C, "<span class='admin_channel'>ADMIN: <span class='name'>[key_name(usr, 1)]</span> ([admin_jump_link(mob)]): <span class='message'>[msg]</span></span>")
|
||||
|
||||
feedback_add_details("admin_verb","M") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
@@ -38,6 +39,7 @@
|
||||
display_name = "[holder.fakekey]/([key])"
|
||||
else
|
||||
display_name = holder.fakekey
|
||||
msg = "<span class='emoji_enabled'>[msg]</span>"
|
||||
to_chat(C, "<span class='[check_rights(R_ADMIN, 0) ? "mentor_channel_admin" : "mentor_channel"]'>MENTOR: <span class='name'>[display_name]</span> ([admin_jump_link(mob)]): <span class='message'>[msg]</span></span>")
|
||||
|
||||
feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
@@ -266,7 +266,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
if(!choice)
|
||||
return 0
|
||||
if(!istype(choice, /mob/dead/observer))
|
||||
var/confirm = input("[choice.key] isn't ghosting right now. Are you sure you want to yank him out of them out of their body and place them in this pAI?", "Spawn pAI Confirmation", "No") in list("Yes", "No")
|
||||
var/confirm = input("[choice.key] isn't ghosting right now. Are you sure you want to yank [choice.p_them()] out of [choice.p_their()] body and place [choice.p_them()] in this pAI?", "Spawn pAI Confirmation", "No") in list("Yes", "No")
|
||||
if(confirm != "Yes")
|
||||
return 0
|
||||
var/obj/item/paicard/card = new(T)
|
||||
|
||||
@@ -92,7 +92,7 @@ var/intercom_range_display_status = 0
|
||||
if(!(locate(/obj/structure/grille,T)))
|
||||
var/window_check = 0
|
||||
for(var/obj/structure/window/W in T)
|
||||
if(W.dir == turn(C1.dir,180) || W.is_fulltile() )
|
||||
if(W.dir == turn(C1.dir,180) || W.fulltile)
|
||||
window_check = 1
|
||||
break
|
||||
if(!window_check)
|
||||
|
||||
@@ -46,6 +46,8 @@ var/list/VVpixelmovement = list("step_x", "step_y", "step_size", "bound_height",
|
||||
|
||||
else if(isfile(var_value))
|
||||
. = VV_FILE
|
||||
else if(istype(var_value, /regex))
|
||||
. = VV_REGEX
|
||||
else
|
||||
. = VV_NULL
|
||||
|
||||
@@ -66,6 +68,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "step_size", "bound_height",
|
||||
VV_DATUM_TYPE,
|
||||
VV_TYPE,
|
||||
VV_MATRIX,
|
||||
VV_REGEX,
|
||||
VV_FILE,
|
||||
VV_NEW_ATOM,
|
||||
VV_NEW_DATUM,
|
||||
@@ -141,6 +144,14 @@ var/list/VVpixelmovement = list("step_x", "step_y", "step_size", "bound_height",
|
||||
.["class"] = null
|
||||
return
|
||||
|
||||
if(VV_REGEX)
|
||||
var/reg = input("Enter regex", "Regex", "") as null|text
|
||||
if(!reg)
|
||||
return
|
||||
.["value"] = regex(reg)
|
||||
if(.["value"] == null)
|
||||
.["class"] = null
|
||||
|
||||
|
||||
if(VV_ATOM_REFERENCE)
|
||||
var/type = pick_closest_path(FALSE)
|
||||
|
||||
@@ -9,6 +9,10 @@
|
||||
|
||||
var/turf/T = get_turf(O)
|
||||
|
||||
var/confirm = alert("Are you sure you want to possess [O]?", "Confirm posession", "Yes", "No")
|
||||
|
||||
if(confirm != "Yes")
|
||||
return
|
||||
if(T)
|
||||
log_admin("[key_name(usr)] has possessed [O] ([O.type]) at ([T.x], [T.y], [T.z])")
|
||||
message_admins("[key_name_admin(usr)] has possessed [O] ([O.type]) at ([T.x], [T.y], [T.z])", 1)
|
||||
@@ -42,4 +46,4 @@
|
||||
usr.loc = O.loc // Appear where the object you were controlling is -- TLE
|
||||
usr.client.eye = usr
|
||||
usr.control_object = null
|
||||
feedback_add_details("admin_verb","RO") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
feedback_add_details("admin_verb","RO") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
@@ -37,8 +37,8 @@ var/global/sent_strike_team = 0
|
||||
break
|
||||
|
||||
// Find ghosts willing to be DS
|
||||
var/list/commando_ckeys = pollCandidatesByKeyWithVeto(src, usr, commandos_possible, "Join the DeathSquad?",, 21, 600, 1, role_playtime_requirements[ROLE_DEATHSQUAD], TRUE, FALSE)
|
||||
if(!commando_ckeys.len)
|
||||
var/list/commando_ghosts = pollCandidatesWithVeto(src, usr, commandos_possible, "Join the DeathSquad?",, 21, 600, 1, role_playtime_requirements[ROLE_DEATHSQUAD], TRUE, FALSE)
|
||||
if(!commando_ghosts.len)
|
||||
to_chat(usr, "<span class='userdanger'>Nobody volunteered to join the DeathSquad.</span>")
|
||||
return
|
||||
|
||||
@@ -47,53 +47,62 @@ var/global/sent_strike_team = 0
|
||||
// Spawns commandos and equips them.
|
||||
var/commando_number = commandos_possible //for selecting a leader
|
||||
var/is_leader = TRUE // set to FALSE after leader is spawned
|
||||
|
||||
for(var/obj/effect/landmark/L in landmarks_list)
|
||||
if(commando_number<=0) break
|
||||
|
||||
if(commando_number <= 0)
|
||||
break
|
||||
|
||||
if(L.name == "Commando")
|
||||
|
||||
spawn(0)
|
||||
var/use_ds_borg = FALSE
|
||||
var/ghost_key // Ghost ckey that we intend to put into the commando. Can remain undefined if we don't have one.
|
||||
if(commando_ckeys.len)
|
||||
ghost_key = pick(commando_ckeys)
|
||||
commando_ckeys -= ghost_key
|
||||
if(!is_leader)
|
||||
var/new_gender = alert(src, "Select Deathsquad Type.", "DS Character Generation", "Organic", "Cyborg")
|
||||
if(new_gender == "Cyborg")
|
||||
use_ds_borg = TRUE
|
||||
if(!commando_ghosts.len)
|
||||
break
|
||||
|
||||
if(use_ds_borg)
|
||||
var/mob/living/silicon/robot/deathsquad/R = new()
|
||||
R.forceMove(get_turf(L))
|
||||
var/rnum = rand(1,1000)
|
||||
var/borgname = "Epsilon [rnum]"
|
||||
R.name = borgname
|
||||
R.custom_name = borgname
|
||||
R.real_name = R.name
|
||||
R.mind = new
|
||||
R.mind.current = R
|
||||
R.mind.original = R
|
||||
R.mind.assigned_role = SPECIAL_ROLE_DEATHSQUAD
|
||||
R.mind.special_role = SPECIAL_ROLE_DEATHSQUAD
|
||||
if(!(R.mind in ticker.minds))
|
||||
ticker.minds += R.mind
|
||||
ticker.mode.traitors += R.mind
|
||||
if(ghost_key)
|
||||
R.key = ghost_key
|
||||
if(nuke_code)
|
||||
R.mind.store_memory("<B>Nuke Code:</B> <span class='warning'>[nuke_code].</span>")
|
||||
R.mind.store_memory("<B>Mission:</B> <span class='warning'>[input].</span>")
|
||||
to_chat(R, "<span class='userdanger'>You are a Special Operations cyborg, in the service of Central Command. \nYour current mission is: <span class='danger'>[input]</span></span>")
|
||||
else
|
||||
var/mob/living/carbon/human/new_commando = create_death_commando(L, is_leader)
|
||||
if(ghost_key)
|
||||
new_commando.key = ghost_key
|
||||
new_commando.internal = new_commando.s_store
|
||||
new_commando.update_action_buttons_icon()
|
||||
if(nuke_code)
|
||||
new_commando.mind.store_memory("<B>Nuke Code:</B> <span class='warning'>[nuke_code].</span>")
|
||||
new_commando.mind.store_memory("<B>Mission:</B> <span class='warning'>[input].</span>")
|
||||
to_chat(new_commando, "<span class='userdanger'>You are a Special Ops [is_leader ? "<B>TEAM LEADER</B>" : "commando"] in the service of Central Command. Check the table ahead for detailed instructions.\nYour current mission is: <span class='danger'>[input]</span></span>")
|
||||
var/use_ds_borg = FALSE
|
||||
var/mob/ghost_mob = pick(commando_ghosts)
|
||||
commando_ghosts -= ghost_mob
|
||||
if(!ghost_mob || !ghost_mob.key || !ghost_mob.client)
|
||||
continue
|
||||
|
||||
if(!is_leader)
|
||||
var/new_dstype = alert(ghost_mob.client, "Select Deathsquad Type.", "DS Character Generation", "Organic", "Cyborg")
|
||||
if(new_dstype == "Cyborg")
|
||||
use_ds_borg = TRUE
|
||||
|
||||
if(!ghost_mob || !ghost_mob.key || !ghost_mob.client) // Have to re-check this due to the above alert() call
|
||||
continue
|
||||
|
||||
if(use_ds_borg)
|
||||
var/mob/living/silicon/robot/deathsquad/R = new()
|
||||
R.forceMove(get_turf(L))
|
||||
var/rnum = rand(1,1000)
|
||||
var/borgname = "Epsilon [rnum]"
|
||||
R.name = borgname
|
||||
R.custom_name = borgname
|
||||
R.real_name = R.name
|
||||
R.mind = new
|
||||
R.mind.current = R
|
||||
R.mind.original = R
|
||||
R.mind.assigned_role = SPECIAL_ROLE_DEATHSQUAD
|
||||
R.mind.special_role = SPECIAL_ROLE_DEATHSQUAD
|
||||
if(!(R.mind in ticker.minds))
|
||||
ticker.minds += R.mind
|
||||
ticker.mode.traitors += R.mind
|
||||
R.key = ghost_mob.key
|
||||
if(nuke_code)
|
||||
R.mind.store_memory("<B>Nuke Code:</B> <span class='warning'>[nuke_code].</span>")
|
||||
R.mind.store_memory("<B>Mission:</B> <span class='warning'>[input].</span>")
|
||||
to_chat(R, "<span class='userdanger'>You are a Special Operations cyborg, in the service of Central Command. \nYour current mission is: <span class='danger'>[input]</span></span>")
|
||||
else
|
||||
var/mob/living/carbon/human/new_commando = create_death_commando(L, is_leader)
|
||||
new_commando.mind.key = ghost_mob.key
|
||||
new_commando.key = ghost_mob.key
|
||||
new_commando.internal = new_commando.s_store
|
||||
new_commando.update_action_buttons_icon()
|
||||
if(nuke_code)
|
||||
new_commando.mind.store_memory("<B>Nuke Code:</B> <span class='warning'>[nuke_code].</span>")
|
||||
new_commando.mind.store_memory("<B>Mission:</B> <span class='warning'>[input].</span>")
|
||||
to_chat(new_commando, "<span class='userdanger'>You are a Special Ops [is_leader ? "<B>TEAM LEADER</B>" : "commando"] in the service of Central Command. Check the table ahead for detailed instructions.\nYour current mission is: <span class='danger'>[input]</span></span>")
|
||||
|
||||
is_leader = FALSE
|
||||
commando_number--
|
||||
@@ -133,6 +142,7 @@ var/global/sent_strike_team = 0
|
||||
A.real_name = "[commando_rank] [commando_name]"
|
||||
A.copy_to(new_commando)
|
||||
|
||||
|
||||
new_commando.dna.ready_dna(new_commando)//Creates DNA.
|
||||
|
||||
//Creates mind stuff.
|
||||
|
||||
@@ -45,8 +45,8 @@ var/global/sent_syndicate_strike_team = 0
|
||||
break
|
||||
|
||||
// Find ghosts willing to be SST
|
||||
var/list/commando_ckeys = pollCandidatesByKeyWithVeto(src, usr, syndicate_commandos_possible, "Join the Syndicate Strike Team?",, 21, 600, 1, role_playtime_requirements[ROLE_DEATHSQUAD], TRUE, FALSE)
|
||||
if(!commando_ckeys.len)
|
||||
var/list/commando_ghosts = pollCandidatesWithVeto(src, usr, syndicate_commandos_possible, "Join the Syndicate Strike Team?",, 21, 600, 1, role_playtime_requirements[ROLE_DEATHSQUAD], TRUE, FALSE)
|
||||
if(!commando_ghosts.len)
|
||||
to_chat(usr, "<span class='userdanger'>Nobody volunteered to join the SST.</span>")
|
||||
return
|
||||
|
||||
@@ -54,15 +54,29 @@ var/global/sent_syndicate_strike_team = 0
|
||||
|
||||
//Spawns commandos and equips them.
|
||||
for(var/obj/effect/landmark/L in landmarks_list)
|
||||
if(syndicate_commando_number<=0) break
|
||||
|
||||
if(syndicate_commando_number <= 0)
|
||||
break
|
||||
|
||||
if(L.name == "Syndicate-Commando")
|
||||
|
||||
if(!commando_ghosts.len)
|
||||
break
|
||||
|
||||
var/mob/ghost_mob = pick(commando_ghosts)
|
||||
commando_ghosts -= ghost_mob
|
||||
|
||||
if(!ghost_mob || !ghost_mob.key || !ghost_mob.client)
|
||||
continue
|
||||
|
||||
var/mob/living/carbon/human/new_syndicate_commando = create_syndicate_death_commando(L, is_leader)
|
||||
|
||||
if(commando_ckeys.len)
|
||||
new_syndicate_commando.key = pick(commando_ckeys)
|
||||
commando_ckeys -= new_syndicate_commando.key
|
||||
new_syndicate_commando.internal = new_syndicate_commando.s_store
|
||||
new_syndicate_commando.update_action_buttons_icon()
|
||||
if(!new_syndicate_commando)
|
||||
continue
|
||||
|
||||
new_syndicate_commando.key = ghost_mob.key
|
||||
new_syndicate_commando.internal = new_syndicate_commando.s_store
|
||||
new_syndicate_commando.update_action_buttons_icon()
|
||||
|
||||
//So they don't forget their code or mission.
|
||||
if(nuke_code)
|
||||
|
||||
Reference in New Issue
Block a user