mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-14 00:23:29 +01:00
Merge remote-tracking branch 'ParadiseSS13/master' into toml-config
This commit is contained in:
@@ -138,7 +138,6 @@ GLOBAL_PROTECT(banlist_savefile) // Obvious reasons
|
||||
log_admin("Ban Expired: [key]")
|
||||
message_admins("Ban Expired: [key]")
|
||||
else
|
||||
ban_unban_log_save("[key_name_admin(usr)] unbanned [key]")
|
||||
log_admin("[key_name_admin(usr)] unbanned [key]")
|
||||
message_admins("[key_name_admin(usr)] unbanned: [key]")
|
||||
usr.client.holder.DB_ban_unban( ckey(key), BANTYPE_ANY_FULLBAN)
|
||||
|
||||
@@ -166,7 +166,12 @@ GLOBAL_LIST_INIT(admin_verbs_debug, list(
|
||||
/client/proc/toggle_medal_disable,
|
||||
/client/proc/uid_log,
|
||||
/client/proc/visualise_active_turfs,
|
||||
/client/proc/reestablish_db_connection
|
||||
/client/proc/reestablish_db_connection,
|
||||
#ifdef REFERENCE_TRACKING
|
||||
/datum/proc/find_refs,
|
||||
/datum/proc/qdel_then_find_references,
|
||||
/datum/proc/qdel_then_if_fail_find_references,
|
||||
#endif
|
||||
))
|
||||
GLOBAL_LIST_INIT(admin_verbs_possess, list(
|
||||
/proc/possess,
|
||||
@@ -507,7 +512,6 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list(
|
||||
return
|
||||
|
||||
if(++D.warns >= MAX_WARNS) //uh ohhhh...you'reee iiiiin trouuuubble O:)
|
||||
ban_unban_log_save("[ckey] warned [warned_ckey], resulting in a [AUTOBANTIME] minute autoban.")
|
||||
if(C)
|
||||
message_admins("[key_name_admin(src)] has warned [key_name_admin(C)] resulting in a [AUTOBANTIME] minute ban")
|
||||
log_admin("[key_name(src)] has warned [key_name(C)] resulting in a [AUTOBANTIME] minute ban")
|
||||
|
||||
@@ -118,10 +118,6 @@ GLOBAL_DATUM_INIT(jobban_regex, /regex, regex("(\[\\S]+) - (\[^#]+\[^# ])(?: ##
|
||||
/proc/jobban_unban_client(ckey, rank)
|
||||
jobban_remove("[ckey] - [rank]")
|
||||
|
||||
/proc/ban_unban_log_save(formatted_log)
|
||||
text2file(formatted_log,"data/ban_unban_log.txt")
|
||||
|
||||
|
||||
/proc/jobban_remove(X)
|
||||
for(var/i = 1; i <= length(GLOB.jobban_keylist); i++)
|
||||
if( findtext(GLOB.jobban_keylist[i], "[X]") )
|
||||
|
||||
@@ -414,6 +414,7 @@
|
||||
qdel(query_update)
|
||||
|
||||
message_admins("[key_name_admin(usr)] has lifted [pckey]'s ban.")
|
||||
log_admin("[key_name(usr)] has lifted [pckey]'s ban.")
|
||||
flag_account_for_forum_sync(pckey)
|
||||
|
||||
|
||||
|
||||
@@ -78,7 +78,7 @@ proc/admin_proc()
|
||||
NOTE: it checks usr! not src! So if you're checking somebody's rank in a proc which they did not call
|
||||
you will have to do something like if(client.holder.rights & R_ADMIN) yourself.
|
||||
*/
|
||||
/proc/check_rights(rights_required, show_msg=1, mob/user = usr)
|
||||
/proc/check_rights(rights_required, show_msg = TRUE, mob/user = usr)
|
||||
if(user && user.client)
|
||||
if(rights_required)
|
||||
if(user.client.holder)
|
||||
|
||||
@@ -70,7 +70,6 @@
|
||||
<A href='?src=[UID()];secretsfun=infiltrators_syndicate'>Send SIT - Syndicate Infiltration Team</A>
|
||||
<A href='?src=[UID()];secretsfun=striketeam_syndicate'>Send in a Syndie Strike Team</A>
|
||||
<BR><A href='?src=[UID()];secretsfun=striketeam'>Send in the Deathsquad</A>
|
||||
<A href='?src=[UID()];secretsfun=honksquad'>Send in a HONKsquad</A><BR>
|
||||
<A href='?src=[UID()];secretsfun=gimmickteam'>Send in a Gimmick Team</A><BR>
|
||||
<b>Change Security Level</b><BR>
|
||||
<A href='?src=[UID()];secretsfun=securitylevel0'>Security Level - Green</A>
|
||||
|
||||
@@ -487,7 +487,6 @@
|
||||
if(!reason) return
|
||||
|
||||
log_admin("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]")
|
||||
ban_unban_log_save("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]")
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]</span>", 1)
|
||||
GLOB.banlist_savefile.cd = "/base/[banfolder]"
|
||||
to_chat(GLOB.banlist_savefile["reason"], reason)
|
||||
@@ -519,7 +518,6 @@
|
||||
return */
|
||||
switch(alert("Reason: '[banreason]' Remove appearance ban?","Please Confirm","Yes","No"))
|
||||
if("Yes")
|
||||
ban_unban_log_save("[key_name(usr)] removed [key_name(M)]'s appearance ban")
|
||||
log_admin("[key_name(usr)] removed [key_name(M)]'s appearance ban")
|
||||
DB_ban_unban(M.ckey, BANTYPE_APPEARANCE)
|
||||
appearance_unban(M)
|
||||
@@ -532,7 +530,6 @@
|
||||
if(!reason)
|
||||
return
|
||||
M = admin_ban_mobsearch(M, ban_ckey_param, usr)
|
||||
ban_unban_log_save("[key_name(usr)] appearance banned [key_name(M)]. reason: [reason]")
|
||||
log_admin("[key_name(usr)] appearance banned [key_name(M)]. \nReason: [reason]")
|
||||
DB_ban_record(BANTYPE_APPEARANCE, M, -1, reason)
|
||||
appearance_fullban(M, "[reason]; By [usr.ckey] on [time2text(world.realtime)]")
|
||||
@@ -893,7 +890,6 @@
|
||||
var/msg
|
||||
M = admin_ban_mobsearch(M, ban_ckey_param, usr)
|
||||
for(var/job in notbannedlist)
|
||||
ban_unban_log_save("[key_name(usr)] temp-jobbanned [key_name(M)] from [job] for [mins] minutes. reason: [reason]")
|
||||
log_admin("[key_name(usr)] temp-jobbanned [key_name(M)] from [job] for [mins] minutes")
|
||||
DB_ban_record(BANTYPE_JOB_TEMP, M, mins, reason, job)
|
||||
jobban_fullban(M, job, "[reason]; By [usr.ckey] on [time2text(world.realtime)]") //Legacy banning does not support temporary jobbans.
|
||||
@@ -914,7 +910,6 @@
|
||||
var/msg
|
||||
M = admin_ban_mobsearch(M, ban_ckey_param, usr)
|
||||
for(var/job in notbannedlist)
|
||||
ban_unban_log_save("[key_name(usr)] perma-jobbanned [key_name(M)] from [job]. reason: [reason]")
|
||||
log_admin("[key_name(usr)] perma-banned [key_name(M)] from [job]")
|
||||
DB_ban_record(BANTYPE_JOB_PERMA, M, -1, reason, job)
|
||||
jobban_fullban(M, job, "[reason]; By [usr.ckey] on [time2text(world.realtime)]")
|
||||
@@ -943,7 +938,6 @@
|
||||
if(!reason) continue //skip if it isn't jobbanned anyway
|
||||
switch(alert("Job: '[job]' Reason: '[reason]' Un-jobban?","Please Confirm","Yes","No"))
|
||||
if("Yes")
|
||||
ban_unban_log_save("[key_name(usr)] unjobbanned [key_name(M)] from [job]")
|
||||
log_admin("[key_name(usr)] unbanned [key_name(M)] from [job]")
|
||||
DB_ban_unban(M.ckey, BANTYPE_JOB_PERMA, job)
|
||||
jobban_unban(M, job)
|
||||
@@ -1068,7 +1062,6 @@
|
||||
return
|
||||
M = admin_ban_mobsearch(M, ban_ckey_param, usr)
|
||||
AddBan(M.ckey, M.computer_id, reason, usr.ckey, 1, mins)
|
||||
ban_unban_log_save("[usr.client.ckey] has banned [M.ckey]. - Reason: [reason] - This will be removed in [mins] minutes.")
|
||||
to_chat(M, "<span class='warning'><big><b>You have been banned by [usr.client.ckey].\nReason: [reason].</b></big></span>")
|
||||
to_chat(M, "<span class='warning'>This is a temporary ban, it will be removed in [mins] minutes.</span>")
|
||||
DB_ban_record(BANTYPE_TEMP, M, mins, reason)
|
||||
@@ -1095,7 +1088,6 @@
|
||||
to_chat(M, "<span class='warning'>To try to resolve this matter head to [GLOB.configuration.url.banappeals_url]</span>")
|
||||
else
|
||||
to_chat(M, "<span class='warning'>No ban appeals URL has been set.</span>")
|
||||
ban_unban_log_save("[usr.client.ckey] has permabanned [M.ckey]. - Reason: [reason] - This ban does not expire automatically and must be appealed.")
|
||||
log_admin("[key_name(usr)] has banned [M.ckey].\nReason: [reason]\nThis ban does not expire automatically and must be appealed.")
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] has banned [M.ckey].\nReason: [reason]\nThis ban does not expire automatically and must be appealed.</span>")
|
||||
DB_ban_record(BANTYPE_PERMA, M, -1, reason)
|
||||
@@ -2894,9 +2886,6 @@
|
||||
spawn(0)
|
||||
H.corgize()
|
||||
ok = 1
|
||||
if("honksquad")
|
||||
if(usr.client.honksquad())
|
||||
SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Send Team - HONKsquad")
|
||||
if("striketeam")
|
||||
if(usr.client.strike_team())
|
||||
SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Send Team - Deathsquad")
|
||||
|
||||
@@ -666,17 +666,19 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode].</span>", 1)
|
||||
|
||||
/client/proc/robust_dress_shop()
|
||||
var/list/outfits = list(
|
||||
var/list/special_outfits = list(
|
||||
"Naked",
|
||||
"As Job...",
|
||||
"Custom..."
|
||||
)
|
||||
|
||||
var/list/outfits = list()
|
||||
var/list/paths = subtypesof(/datum/outfit) - typesof(/datum/outfit/job)
|
||||
for(var/path in paths)
|
||||
var/datum/outfit/O = path //not much to initalize here but whatever
|
||||
if(initial(O.can_be_admin_equipped))
|
||||
outfits[initial(O.name)] = path
|
||||
outfits = special_outfits + sortTim(outfits, /proc/cmp_text_asc)
|
||||
|
||||
var/dresscode = input("Select outfit", "Robust quick dress shop") as null|anything in outfits
|
||||
if(isnull(dresscode))
|
||||
@@ -692,6 +694,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
var/datum/outfit/O = path
|
||||
if(initial(O.can_be_admin_equipped))
|
||||
job_outfits[initial(O.name)] = path
|
||||
job_outfits = sortTim(job_outfits, /proc/cmp_text_asc)
|
||||
|
||||
dresscode = input("Select job equipment", "Robust quick dress shop") as null|anything in job_outfits
|
||||
dresscode = job_outfits[dresscode]
|
||||
|
||||
@@ -1,142 +0,0 @@
|
||||
//HONKsquad
|
||||
|
||||
#define HONKSQUAD_POSSIBLE 6 //if more Commandos are needed in the future
|
||||
GLOBAL_VAR_INIT(sent_honksquad, 0)
|
||||
|
||||
/client/proc/honksquad()
|
||||
if(!SSticker)
|
||||
to_chat(usr, "<font color='red'>The game hasn't started yet!</font>")
|
||||
return
|
||||
if(world.time < 6000)
|
||||
to_chat(usr, "<font color='red'>There are [(6000-world.time)/10] seconds remaining before it may be called.</font>")
|
||||
return
|
||||
if(GLOB.sent_honksquad == 1)
|
||||
to_chat(usr, "<font color='red'>Clown Planet has already dispatched a HONKsquad.</font>")
|
||||
return
|
||||
if(alert("Do you want to send in the HONKsquad? Once enabled, this is irreversible.",,"Yes","No")!="Yes")
|
||||
return
|
||||
alert("This 'mode' will go on until proper levels of HONK have been restored. You may also admin-call the evac shuttle when appropriate. Assigning the team's detailed task is recommended from there. While you will be able to manually pick the candidates from active ghosts, their assignment in the squad will be random.")
|
||||
|
||||
var/input = null
|
||||
while(!input)
|
||||
input = sanitize(copytext(input(src, "Please specify which mission the HONKsquad shall undertake.", "Specify Mission", ""),1,MAX_MESSAGE_LEN))
|
||||
if(!input)
|
||||
if(alert("Error, no mission set. Do you want to exit the setup process?",,"Yes","No")=="Yes")
|
||||
return
|
||||
|
||||
if(GLOB.sent_honksquad)
|
||||
to_chat(usr, "Looks like someone beat you to it. HONK.")
|
||||
return
|
||||
|
||||
GLOB.sent_honksquad = 1
|
||||
|
||||
|
||||
var/honksquad_number = HONKSQUAD_POSSIBLE //for selecting a leader
|
||||
var/honk_leader_selected = 0 //when the leader is chosen. The last person spawned.
|
||||
|
||||
|
||||
//Generates a list of HONKsquad from active ghosts. Then the user picks which characters to respawn as the commandos.
|
||||
var/list/candidates = list() //candidates for being a commando out of all the active ghosts in world.
|
||||
var/list/commandos = list() //actual commando ghosts as picked by the user.
|
||||
for(var/mob/dead/observer/G in GLOB.player_list)
|
||||
if(!G.client.holder && !G.client.is_afk()) //Whoever called/has the proc won't be added to the list.
|
||||
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
|
||||
candidates += G.key
|
||||
for(var/i=HONKSQUAD_POSSIBLE,(i>0&&candidates.len),i--)//Decrease with every commando selected.
|
||||
var/candidate = input("Pick characters to spawn as the HONKsquad. This will go on until there either no more ghosts to pick from or the slots are full.", "Active Players") as null|anything in candidates //It will auto-pick a person when there is only one candidate.
|
||||
candidates -= candidate //Subtract from candidates.
|
||||
commandos += candidate//Add their ghost to commandos.
|
||||
|
||||
//Spawns HONKsquad and equips them.
|
||||
for(var/thing in GLOB.landmarks_list)
|
||||
var/obj/effect/landmark/L = thing
|
||||
if(honksquad_number<=0) break
|
||||
if(L.name == "HONKsquad")
|
||||
honk_leader_selected = honksquad_number == 1?1:0
|
||||
|
||||
var/mob/living/carbon/human/new_honksquad = create_honksquad(L, honk_leader_selected)
|
||||
|
||||
if(commandos.len)
|
||||
new_honksquad.key = pick(commandos)
|
||||
commandos -= new_honksquad.key
|
||||
new_honksquad.internal = new_honksquad.s_store
|
||||
new_honksquad.update_action_buttons_icon()
|
||||
|
||||
//So they don't forget their code or mission.
|
||||
new_honksquad.mind.store_memory("<B>Mission:</B> <span class='warning'>[input].</span>")
|
||||
|
||||
to_chat(new_honksquad, "<span class='notice'>You are a HONKsquad. [!honk_leader_selected ? "commando" : "<B>LEADER</B>"] in the service of Clown Planet. You are called in cases of exteme low levels of HONK. You are NOT authorized to kill.\nYour current mission is: <span class='danger'>[input]</span></span>")
|
||||
|
||||
honksquad_number--
|
||||
|
||||
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] has spawned a HONKsquad.</span>", 1)
|
||||
log_admin("[key_name(usr)] used Spawn HONKsquad.")
|
||||
return 1
|
||||
|
||||
/client/proc/create_honksquad(obj/spawn_location, honk_leader_selected = 0)
|
||||
var/mob/living/carbon/human/new_honksquad = new(spawn_location.loc)
|
||||
var/honksquad_leader_rank = pick("Lieutenant", "Captain", "Major")
|
||||
var/honksquad_rank = pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant 1st Class", "Master Sergeant", "Sergeant Major")
|
||||
var/honksquad_name = pick(GLOB.clown_names)
|
||||
|
||||
var/datum/preferences/A = new()//Randomize appearance for the commando.
|
||||
if(honk_leader_selected)
|
||||
A.age = rand(35,45)
|
||||
A.real_name = "[honksquad_leader_rank] [honksquad_name]"
|
||||
else
|
||||
A.real_name = "[honksquad_rank] [honksquad_name]"
|
||||
A.copy_to(new_honksquad)
|
||||
|
||||
new_honksquad.dna.ready_dna(new_honksquad)//Creates DNA.
|
||||
|
||||
//Creates mind stuff.
|
||||
new_honksquad.mind_initialize()
|
||||
new_honksquad.mind.assigned_role = SPECIAL_ROLE_HONKSQUAD
|
||||
new_honksquad.mind.special_role = SPECIAL_ROLE_HONKSQUAD
|
||||
new_honksquad.mind.offstation_role = TRUE
|
||||
new_honksquad.add_language("Clownish")
|
||||
SSticker.mode.traitors |= new_honksquad.mind//Adds them to current traitor list. Which is really the extra antagonist list.
|
||||
new_honksquad.equip_honksquad(honk_leader_selected)
|
||||
return new_honksquad
|
||||
|
||||
/mob/living/carbon/human/proc/equip_honksquad(honk_leader_selected = 0)
|
||||
|
||||
var/obj/item/radio/R = new /obj/item/radio/headset(src)
|
||||
R.set_frequency(1442)
|
||||
equip_to_slot_or_del(R, slot_l_ear)
|
||||
equip_to_slot_or_del(new /obj/item/storage/backpack/clown(src), slot_back)
|
||||
equip_to_slot_or_del(new /obj/item/storage/box/survival(src), slot_in_backpack)
|
||||
if(src.gender == FEMALE)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat/sexy(src), slot_wear_mask)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown/sexy(src), slot_w_uniform)
|
||||
else
|
||||
equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(src), slot_w_uniform)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(src), slot_wear_mask)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(src), slot_shoes)
|
||||
equip_to_slot_or_del(new /obj/item/pda/clown(src), slot_wear_pda)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(src), slot_wear_mask)
|
||||
equip_to_slot_or_del(new /obj/item/reagent_containers/food/snacks/grown/banana(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/bikehorn(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/stamp/clown(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/toy/crayon/rainbow(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/reagent_containers/spray/waterflower(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/reagent_containers/food/pill/patch/jestosterone(src), slot_r_store)
|
||||
if(prob(50))
|
||||
equip_to_slot_or_del(new /obj/item/gun/energy/clown(src), slot_in_backpack)
|
||||
else
|
||||
equip_to_slot_or_del(new /obj/item/gun/throw/piecannon(src), slot_in_backpack)
|
||||
dna.SetSEState(GLOB.clumsyblock, TRUE)
|
||||
singlemutcheck(src, GLOB.clumsyblock, MUTCHK_FORCED)
|
||||
|
||||
|
||||
|
||||
var/obj/item/card/id/W = new(src)
|
||||
W.name = "[real_name]'s ID Card"
|
||||
W.icon_state = "centcom_old"
|
||||
W.access = list(ACCESS_CLOWN)//They get full station access.
|
||||
W.assignment = "HONKsquad"
|
||||
W.registered_name = real_name
|
||||
equip_to_slot_or_del(W, slot_wear_id)
|
||||
|
||||
return 1
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
/datum/admins/proc/CandCheck(role = null, mob/living/carbon/human/M, datum/game_mode/temp = null)
|
||||
// You pass in ROLE define (optional), the applicant, and the gamemode, and it will return true / false depending on whether the applicant qualify for the candidacy in question
|
||||
if(jobban_isbanned(M, "Syndicate"))
|
||||
if(jobban_isbanned(M, ROLE_SYNDICATE))
|
||||
return FALSE
|
||||
if(M.stat || !M.mind || M.mind.special_role || M.mind.offstation_role)
|
||||
return FALSE
|
||||
@@ -199,7 +199,7 @@
|
||||
|
||||
for(var/mob/G in GLOB.respawnable_list)
|
||||
if(istype(G) && G.client && (ROLE_OPERATIVE in G.client.prefs.be_special))
|
||||
if(!jobban_isbanned(G, "operative") && !jobban_isbanned(G, "Syndicate"))
|
||||
if(!jobban_isbanned(G, ROLE_OPERATIVE) && !jobban_isbanned(G, ROLE_SYNDICATE))
|
||||
if(player_old_enough_antag(G.client,ROLE_OPERATIVE))
|
||||
spawn(0)
|
||||
switch(alert(G,"Do you wish to be considered for a nuke team being sent in?","Please answer in 30 seconds!","Yes","No"))
|
||||
@@ -316,7 +316,7 @@
|
||||
|
||||
//Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos.
|
||||
for(var/mob/G in GLOB.respawnable_list)
|
||||
if(!jobban_isbanned(G, "Syndicate"))
|
||||
if(!jobban_isbanned(G, ROLE_SYNDICATE))
|
||||
spawn(0)
|
||||
switch(alert(G,"Do you wish to be considered for an elite syndicate strike team being sent in?","Please answer in 30 seconds!","Yes","No"))
|
||||
if("Yes")
|
||||
@@ -427,7 +427,7 @@
|
||||
for(var/mob/G in GLOB.respawnable_list)
|
||||
if(istype(G) && G.client && (ROLE_RAIDER in G.client.prefs.be_special))
|
||||
if(player_old_enough_antag(G.client,ROLE_RAIDER))
|
||||
if(!jobban_isbanned(G, "raider") && !jobban_isbanned(G, "Syndicate"))
|
||||
if(!jobban_isbanned(G, ROLE_RAIDER) && !jobban_isbanned(G, ROLE_SYNDICATE))
|
||||
spawn(0)
|
||||
switch(alert(G,"Do you wish to be considered for a vox raiding party arriving on the station?","Please answer in 30 seconds!","Yes","No"))
|
||||
if("Yes")
|
||||
|
||||
@@ -59,15 +59,6 @@
|
||||
if(X.prefs.sound & SOUND_ADMINHELP)
|
||||
SEND_SOUND(X, sound('sound/effects/adminhelp.ogg'))
|
||||
|
||||
/proc/HONK_announce(text, mob/Sender)
|
||||
var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN))
|
||||
msg = "<span class='boldnotice'><font color=pink>HONK: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) (<A HREF='?_src_=holder;HONKReply=[Sender.UID()]'>RPLY</A>):</span> [msg]"
|
||||
for(var/client/X in GLOB.admins)
|
||||
if(R_EVENT & X.holder.rights)
|
||||
to_chat(X, msg)
|
||||
if(X.prefs.sound & SOUND_ADMINHELP)
|
||||
SEND_SOUND(X, sound('sound/effects/adminhelp.ogg'))
|
||||
|
||||
/proc/ERT_Announce(text, mob/Sender, repeat_warning)
|
||||
var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN))
|
||||
msg = "<span class='adminnotice'><b><font color=orange>ERT REQUEST: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) (<A HREF='?_src_=holder;ErtReply=[Sender.UID()]'>RESPOND</A>):</b> [msg]</span>"
|
||||
|
||||
@@ -498,11 +498,16 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
if(!ckey)
|
||||
var/list/candidates = list()
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(M.stat != DEAD) continue //we are not dead!
|
||||
if(!(ROLE_ALIEN in M.client.prefs.be_special)) continue //we don't want to be an alium
|
||||
if(jobban_isbanned(M, "alien") || jobban_isbanned(M, "Syndicate")) continue //we are jobbanned
|
||||
if(M.client.is_afk()) continue //we are afk
|
||||
if(M.mind && M.mind.current && M.mind.current.stat != DEAD) continue //we have a live body we are tied to
|
||||
if(M.stat != DEAD)
|
||||
continue //we are not dead!
|
||||
if(!(ROLE_ALIEN in M.client.prefs.be_special))
|
||||
continue //we don't want to be an alium
|
||||
if(jobban_isbanned(M, ROLE_ALIEN) || jobban_isbanned(M, ROLE_SYNDICATE))
|
||||
continue //we are jobbanned
|
||||
if(M.client.is_afk())
|
||||
continue //we are afk
|
||||
if(M.mind && M.mind.current && M.mind.current.stat != DEAD)
|
||||
continue //we have a live body we are tied to
|
||||
candidates += M.ckey
|
||||
if(candidates.len)
|
||||
ckey = input("Pick the player you want to respawn as a xeno.", "Suitable Candidates") as null|anything in candidates
|
||||
|
||||
@@ -153,7 +153,7 @@ GLOBAL_VAR_INIT(sent_syndicate_strike_team, 0)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/suit/space/hardsuit/syndi/elite/sst(src), slot_wear_suit)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
|
||||
equip_to_slot_or_del(new /obj/item/storage/belt/military/sst(src), slot_belt)
|
||||
equip_to_slot_or_del(new /obj/item/tank/jetpack/oxygen/harness(src), slot_s_store)
|
||||
equip_to_slot_or_del(new /obj/item/tank/internals/oxygen/red(src), slot_s_store)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/syndie/advance(src), slot_shoes)
|
||||
equip_to_slot_or_del(new /obj/item/gun/projectile/automatic/l6_saw(src), slot_r_hand)
|
||||
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/mm556x45(src), slot_in_backpack)
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
/datum/rep_purchase/item/pinpointer,
|
||||
/datum/rep_purchase/item/baton,
|
||||
/datum/rep_purchase/item/fulton,
|
||||
/datum/rep_purchase/item/flare,
|
||||
/datum/rep_purchase/blackout,
|
||||
/datum/rep_purchase/item/zippo,
|
||||
/datum/rep_purchase/item/balloon,
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* # Rep Purchase - Emergency escape flare
|
||||
*/
|
||||
/datum/rep_purchase/item/flare
|
||||
name = "Emergency extraction kit"
|
||||
description = "A kit that comes with an emergency escape flare, which will allow you to teleport to any beacon after a short activation delay. Also comes with a Syndicate teleporter beacon that only these flares and emagged teleporters can target."
|
||||
cost = 2
|
||||
stock = 3
|
||||
item_type = /obj/item/storage/box/syndie_kit/escape_flare
|
||||
@@ -363,6 +363,9 @@
|
||||
// Greys get to keep their implant
|
||||
if(isgrey(H) && istype(I, /obj/item/organ/internal/cyberimp/brain/speech_translator))
|
||||
continue
|
||||
// IPCs keep this implant, free of charge!
|
||||
if(ismachineperson(H) && istype(I, /obj/item/organ/internal/cyberimp/arm/power_cord))
|
||||
continue
|
||||
// Try removing it
|
||||
I = I.remove(H)
|
||||
if(I)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/item/assembly/igniter
|
||||
name = "igniter"
|
||||
desc = "A small electronic device able to ignite combustable substances."
|
||||
desc = "A small electronic device able to ignite combustible substances."
|
||||
icon_state = "igniter"
|
||||
materials = list(MAT_METAL=500, MAT_GLASS=50)
|
||||
origin_tech = "magnets=1"
|
||||
|
||||
@@ -418,6 +418,7 @@
|
||||
GLOB.admins -= src
|
||||
GLOB.directory -= ckey
|
||||
GLOB.clients -= src
|
||||
QDEL_NULL(chatOutput)
|
||||
if(movingmob)
|
||||
movingmob.client_mobs_in_contents -= mob
|
||||
UNSETEMPTY(movingmob.client_mobs_in_contents)
|
||||
|
||||
@@ -63,10 +63,6 @@
|
||||
display_name = "Fur Cap"
|
||||
path = /obj/item/clothing/head/furcap
|
||||
|
||||
/datum/gear/donor/mouse
|
||||
display_name = "Mouse Headband"
|
||||
path = /obj/item/clothing/head/kitty/mouse
|
||||
|
||||
/datum/gear/donor/fawkes
|
||||
display_name = "Guy Fawkes mask"
|
||||
path = /obj/item/clothing/mask/fawkes
|
||||
|
||||
@@ -138,10 +138,6 @@
|
||||
path = /obj/item/cartridge/mob_hunt_game
|
||||
cost = 2
|
||||
|
||||
/datum/gear/piano_synth
|
||||
display_name ="synthesizer"
|
||||
path = /obj/item/instrument/piano_synth
|
||||
cost = 2
|
||||
//////////////////////
|
||||
// Mugs //
|
||||
//////////////////////
|
||||
@@ -197,3 +193,62 @@
|
||||
display_name = "crewmember coffee mug"
|
||||
description = "A crewmember's coffee mug, emblazoned in the colors of the Service department."
|
||||
path = /obj/item/reagent_containers/food/drinks/mug/serv
|
||||
|
||||
|
||||
//////////////////////
|
||||
// Instruments //
|
||||
//////////////////////
|
||||
|
||||
/datum/gear/instrument
|
||||
display_name = "Synthesizer"
|
||||
path = /obj/item/instrument/piano_synth
|
||||
sort_category = "Instruments"
|
||||
cost = 2
|
||||
|
||||
/datum/gear/instrument/accordion
|
||||
display_name = "Accordion"
|
||||
path = /obj/item/instrument/accordion
|
||||
|
||||
/datum/gear/instrument/banjo
|
||||
display_name = "Banjo"
|
||||
path = /obj/item/instrument/banjo
|
||||
|
||||
/datum/gear/instrument/eguitar
|
||||
display_name = "Electric guitar"
|
||||
path = /obj/item/instrument/eguitar
|
||||
|
||||
/datum/gear/instrument/glock
|
||||
display_name = "Glockenspiel"
|
||||
path = /obj/item/instrument/glockenspiel
|
||||
|
||||
/datum/gear/instrument/guitar
|
||||
display_name = "Guitar"
|
||||
path = /obj/item/instrument/guitar
|
||||
|
||||
/datum/gear/instrument/harmonica
|
||||
display_name = "Harmonica"
|
||||
path = /obj/item/instrument/harmonica
|
||||
|
||||
/datum/gear/instrument/recorder
|
||||
display_name = "Recorder"
|
||||
path = /obj/item/instrument/recorder
|
||||
|
||||
/datum/gear/instrument/sax
|
||||
display_name = "Saxophone"
|
||||
path = /obj/item/instrument/saxophone
|
||||
|
||||
/datum/gear/instrument/trumpet
|
||||
display_name = "Trumpet"
|
||||
path = /obj/item/instrument/trumpet
|
||||
|
||||
/datum/gear/instrument/trombone
|
||||
display_name = "Trombone"
|
||||
path = /obj/item/instrument/trombone
|
||||
|
||||
/datum/gear/instrument/violin
|
||||
display_name = "Violin"
|
||||
path = /obj/item/instrument/violin
|
||||
|
||||
/datum/gear/instrument/xylo
|
||||
display_name = "Xylophone"
|
||||
path = /obj/item/instrument/xylophone
|
||||
|
||||
@@ -362,7 +362,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
|
||||
dat += "</td><td width='405px' height='200px' valign='top'>"
|
||||
dat += "<h2>Occupation Choices</h2>"
|
||||
dat += "<a href='?_src_=prefs;preference=job;task=menu'>Set Occupation Preferences</a><br>"
|
||||
if(jobban_isbanned(user, "Records"))
|
||||
if(jobban_isbanned(user, ROLEBAN_RECORDS))
|
||||
dat += "<b>You are banned from using character records.</b><br>"
|
||||
else
|
||||
dat += "<a href=\"byond://?_src_=prefs;preference=records;record=1\">Character Records</a><br>"
|
||||
@@ -495,7 +495,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
|
||||
// RIGHT SIDE OF THE PAGE
|
||||
dat += "</td><td width='300px' height='300px' valign='top'>"
|
||||
dat += "<h2>Special Role Settings</h2>"
|
||||
if(jobban_isbanned(user, "Syndicate"))
|
||||
if(jobban_isbanned(user, ROLE_SYNDICATE))
|
||||
dat += "<b>You are banned from special roles.</b>"
|
||||
be_special = list()
|
||||
else
|
||||
|
||||
@@ -509,8 +509,8 @@
|
||||
chameleon_action.emp_randomise(INFINITY)
|
||||
|
||||
/obj/item/storage/belt/chameleon
|
||||
name = "toolbelt"
|
||||
desc = "Holds tools."
|
||||
name = "tool-belt"
|
||||
desc = "Can hold various tools."
|
||||
var/datum/action/item_action/chameleon/change/chameleon_action
|
||||
|
||||
/obj/item/storage/belt/chameleon/Initialize(mapload)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
suit_adjusted = 1
|
||||
blood_overlay_type = "coat"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
|
||||
allowed = list(/obj/item/analyzer,/obj/item/stack/medical,/obj/item/dnainjector,/obj/item/reagent_containers/dropper,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/hypospray,/obj/item/reagent_containers/applicator,/obj/item/healthanalyzer,/obj/item/flashlight/pen,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/food/pill,/obj/item/storage/pill_bottle,/obj/item/paper,/obj/item/rad_laser)
|
||||
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/food/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/rad_laser, /obj/item/robotanalyzer)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 50, "acid" = 50)
|
||||
species_exception = list(/datum/species/golem)
|
||||
sprite_sheets = list(
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
if(ishuman(loc))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
if(H.mind && H.mind.assigned_role == "Clown")
|
||||
GLOB.score_clownabuse++
|
||||
SSticker.score.score_clown_abuse++
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/under/rank/clown/sexy
|
||||
|
||||
@@ -38,7 +38,11 @@
|
||||
R.stamped += /obj/item/stamp
|
||||
R.overlays += stampoverlay
|
||||
R.stamps += "<HR><i>This paper has been stamped by the EFTPOS device.</i>"
|
||||
var/obj/item/smallDelivery/D = new(R.loc)
|
||||
var/obj/item/smallDelivery/D = new(get_turf(loc))
|
||||
if(istype(loc, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
if(H.back)
|
||||
D.forceMove(H.back)
|
||||
R.forceMove(D)
|
||||
D.wrapped = R
|
||||
D.name = "small parcel - 'EFTPOS access code'"
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
/datum/event/wallrot/setup()
|
||||
announceWhen = rand(0, 300)
|
||||
endWhen = announceWhen + 1
|
||||
|
||||
/datum/event/wallrot/announce()
|
||||
GLOB.event_announcement.Announce("Harmful fungi detected on station. Station structures may be contaminated.", "Biohazard Alert")
|
||||
|
||||
/datum/event/wallrot/start()
|
||||
INVOKE_ASYNC(src, .proc/spawn_wallrot)
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
var/const/duration = 13 //Directly relates to the 'weaken' duration. Lowered by armor (i.e. helmets)
|
||||
var/isGlass = 1 //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/proc/smash(mob/living/target, mob/living/user, ranged = 0)
|
||||
/obj/item/reagent_containers/food/drinks/bottle/proc/smash(mob/living/target, mob/living/user, ranged = FALSE)
|
||||
|
||||
//Creates a shattering noise and replaces the bottle with a broken_bottle
|
||||
var/new_location = get_turf(loc)
|
||||
@@ -124,6 +124,11 @@
|
||||
reagents.reaction(M, REAGENT_TOUCH)
|
||||
reagents.clear_reagents()
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/throw_impact(atom/target,mob/thrower)
|
||||
..()
|
||||
SplashReagents(target)
|
||||
smash(target, thrower, ranged = TRUE)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/decompile_act(obj/item/matter_decompiler/C, mob/user)
|
||||
if(!reagents.total_volume)
|
||||
C.stored_comms["glass"] += 3
|
||||
@@ -345,11 +350,10 @@
|
||||
if(istype(R, A))
|
||||
firestarter = 1
|
||||
break
|
||||
SplashReagents(target)
|
||||
..()
|
||||
if(firestarter && active)
|
||||
target.fire_act()
|
||||
new /obj/effect/hotspot(get_turf(target))
|
||||
..()
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/molotov/attackby(obj/item/I, mob/user, params)
|
||||
if(is_hot(I) && !active)
|
||||
|
||||
@@ -89,3 +89,87 @@
|
||||
if(ishuman(L))
|
||||
shake_camera(L, 20, 1)
|
||||
addtimer(CALLBACK(L, /mob/living/carbon.proc/vomit), 20)
|
||||
|
||||
/obj/item/wormhole_jaunter/contractor
|
||||
name = "emergency extraction flare"
|
||||
icon = 'icons/obj/lighting.dmi'
|
||||
desc = "A single-use extraction flare that will let you create a portal to any beacon on the station. You must choose the destination beforehand, else it will target a random beacon. The portal is generated 5 seconds after activation, and has 1 use."
|
||||
icon_state = "flare-contractor"
|
||||
item_state = "flare"
|
||||
var/destination
|
||||
|
||||
/obj/item/wormhole_jaunter/contractor/verb/set_destination()
|
||||
set category = "Object"
|
||||
set name = "Change Portal Destination"
|
||||
set src in usr
|
||||
|
||||
var/list/L = list()
|
||||
var/list/areaindex = list()
|
||||
|
||||
for(var/obj/item/radio/beacon/R in GLOB.beacons)
|
||||
var/turf/T = get_turf(R)
|
||||
if(!T)
|
||||
continue
|
||||
if(!is_teleport_allowed(T.z))
|
||||
continue
|
||||
var/tmpname = T.loc.name
|
||||
if(areaindex[tmpname])
|
||||
tmpname = "[tmpname] ([++areaindex[tmpname]])"
|
||||
else
|
||||
areaindex[tmpname] = 1
|
||||
L[tmpname] = R
|
||||
|
||||
var/desc = input("Please select a location to target.", "Flare Target Interface") in L
|
||||
destination = L[desc]
|
||||
return
|
||||
|
||||
/obj/item/wormhole_jaunter/contractor/attack_self(mob/user) // message is later down
|
||||
activate(user, TRUE)
|
||||
|
||||
/obj/item/wormhole_jaunter/contractor/activate(mob/user)
|
||||
if(!turf_check(user))
|
||||
return
|
||||
if(!destination)
|
||||
var/list/L = get_destinations(user)
|
||||
if(!length(L))
|
||||
to_chat(user, "<span class='warning'>[src] found no beacons in the sector to target.</span>")
|
||||
return
|
||||
destination = pick(L)
|
||||
var/obj/effect/temp_visual/getaway_flare/F = new(get_turf(src))
|
||||
user.visible_message("<span class='notice'>[user] pulls out a black and gold flare and lights it.</span>",\
|
||||
"<span class='notice'>You light an emergency extraction flare, initiating the extraction process.</span>")
|
||||
user.drop_item()
|
||||
forceMove(F)
|
||||
addtimer(CALLBACK(src, .proc/create_portal, destination), 5 SECONDS)
|
||||
|
||||
/obj/item/wormhole_jaunter/contractor/proc/create_portal(turf/destination)
|
||||
new /obj/effect/decal/cleanable/ash(get_turf(src))
|
||||
new /obj/effect/portal/redspace/getaway(get_turf(src), get_turf(destination), src, 100)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/wormhole_jaunter/contractor/emag_act(mob/user)
|
||||
to_chat(user, "<span class='warning'>Emagging [src] has no effect.</span>")
|
||||
|
||||
/obj/item/wormhole_jaunter/contractor/chasm_react(mob/user)
|
||||
return //This is not an instant getaway portal like the jaunter
|
||||
|
||||
/obj/item/storage/box/syndie_kit/escape_flare
|
||||
name = "emergency extraction kit"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/escape_flare/populate_contents()
|
||||
new /obj/item/wormhole_jaunter/contractor(src)
|
||||
new /obj/item/radio/beacon/emagged(src)
|
||||
|
||||
/obj/effect/portal/redspace/getaway
|
||||
one_use = TRUE
|
||||
|
||||
/obj/effect/temp_visual/getaway_flare // Because the original contractor flare is not a temp visual, for some reason.
|
||||
name = "contractor extraction flare"
|
||||
icon = 'icons/obj/lighting.dmi'
|
||||
icon_state = "flare-contractor-on"
|
||||
duration = 5.1 SECONDS // Needs to be slightly longer then the callback to make the portal
|
||||
|
||||
/obj/effect/temp_visual/getaway_flare/Initialize()
|
||||
. = ..()
|
||||
playsound(loc, 'sound/goonstation/misc/matchstick_light.ogg', 50, TRUE)
|
||||
set_light(8, l_color = "#FFD165")
|
||||
|
||||
@@ -381,7 +381,6 @@
|
||||
damage_type = BRUTE
|
||||
hitsound = 'sound/effects/splat.ogg'
|
||||
weaken = 3
|
||||
var/chain
|
||||
|
||||
/obj/item/projectile/hook/fire(setAngle)
|
||||
if(firer)
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
desc = "It's watching you suspiciously."
|
||||
|
||||
/obj/structure/closet/crate/necropolis/tendril/populate_contents()
|
||||
var/loot = rand(1, 27)
|
||||
var/loot = rand(1, 26)
|
||||
switch(loot)
|
||||
if(1)
|
||||
new /obj/item/shared_storage/red(src)
|
||||
@@ -44,38 +44,36 @@
|
||||
if(12)
|
||||
new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/berserker(src)
|
||||
if(13)
|
||||
new /obj/item/jacobs_ladder(src)
|
||||
if(14)
|
||||
new /obj/item/nullrod/scythe/talking(src)
|
||||
if(15)
|
||||
if(14)
|
||||
new /obj/item/nullrod/armblade/mining(src)
|
||||
if(16)
|
||||
if(15)
|
||||
new /obj/item/guardiancreator(src)
|
||||
if(17)
|
||||
if(16)
|
||||
if(prob(50))
|
||||
new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(src)
|
||||
else
|
||||
new /obj/item/disk/design_disk/modkit_disc/bounty(src)
|
||||
if(18)
|
||||
if(17)
|
||||
new /obj/item/warp_cube/red(src)
|
||||
if(19)
|
||||
if(18)
|
||||
new /obj/item/wisp_lantern(src)
|
||||
if(20)
|
||||
if(19)
|
||||
new /obj/item/immortality_talisman(src)
|
||||
if(21)
|
||||
if(20)
|
||||
new /obj/item/gun/magic/hook(src)
|
||||
if(22)
|
||||
if(21)
|
||||
new /obj/item/voodoo(src)
|
||||
if(23)
|
||||
if(22)
|
||||
new /obj/item/grenade/clusterbuster/inferno(src)
|
||||
if(24)
|
||||
if(23)
|
||||
new /obj/item/reagent_containers/food/drinks/bottle/holywater/hell(src)
|
||||
new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor(src)
|
||||
if(25)
|
||||
if(24)
|
||||
new /obj/item/spellbook/oneuse/summonitem(src)
|
||||
if(26)
|
||||
if(25)
|
||||
new /obj/item/book_of_babel(src)
|
||||
if(27)
|
||||
if(26)
|
||||
new /obj/item/borg/upgrade/modkit/lifesteal(src)
|
||||
new /obj/item/bedsheet/cult(src)
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
pixel_x = rand(0, 16) - 8
|
||||
pixel_y = rand(0, 8) - 8
|
||||
if(is_mining_level(z))
|
||||
GLOB.score_oremined++ //When ore spawns, increment score. Only include ore spawned on mining level (No Clown Planet)
|
||||
SSticker.score.score_ore_mined++ //When ore spawns, increment score. Only include ore spawned on mining level (No Clown Planet)
|
||||
|
||||
/obj/item/stack/ore/welder_act(mob/user, obj/item/I)
|
||||
. = TRUE
|
||||
|
||||
@@ -360,20 +360,21 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
if(!client)
|
||||
return
|
||||
var/mob/dead/observer/M = src
|
||||
if(jobban_isbanned(M, "AntagHUD"))
|
||||
if(jobban_isbanned(M, ROLEBAN_AHUD))
|
||||
to_chat(src, "<span class='danger'>You have been banned from using this feature</span>")
|
||||
return
|
||||
if(GLOB.configuration.general.restrict_antag_hud_rejoin && !M.has_enabled_antagHUD && !check_rights(R_ADMIN|R_MOD,0))
|
||||
var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No")
|
||||
if(response == "No") return
|
||||
M.can_reenter_corpse = 0
|
||||
|
||||
var/restricted_use = (!M.has_enabled_antagHUD && !check_rights(R_ADMIN|R_MOD, FALSE)) // Admins can freely toggle it
|
||||
if(GLOB.configuration.general.restrict_antag_hud_rejoin && restricted_use)
|
||||
var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.", "Are you sure you want to turn this feature on?", "Yes", "No")
|
||||
if(response == "No")
|
||||
return
|
||||
M.can_reenter_corpse = FALSE
|
||||
if(M in GLOB.respawnable_list)
|
||||
GLOB.respawnable_list -= M
|
||||
if(!M.has_enabled_antagHUD && !check_rights(R_ADMIN|R_MOD,0))
|
||||
M.has_enabled_antagHUD = 1
|
||||
|
||||
//var/datum/atom_hud/A = huds[DATA_HUD_SECURITY_ADVANCED]
|
||||
//var/adding_hud = (usr in A.hudusers) ? 0 : 1
|
||||
if(restricted_use)
|
||||
M.has_enabled_antagHUD = TRUE
|
||||
|
||||
for(var/datum/atom_hud/antag/H in (GLOB.huds))
|
||||
if(!M.antagHUD)
|
||||
@@ -382,9 +383,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
H.remove_hud_from(usr)
|
||||
if(!M.antagHUD)
|
||||
to_chat(usr, "AntagHud Toggled ON")
|
||||
create_log(MISC_LOG, "Enabled AntagHUD")
|
||||
log_game("[key_name(usr)] has enabled AntagHUD.")
|
||||
M.antagHUD = TRUE
|
||||
else
|
||||
to_chat(usr, "AntagHud Toggled OFF")
|
||||
create_log(MISC_LOG, "Disabled AntagHUD")
|
||||
log_game("[key_name(usr)] has disabled AntagHUD.")
|
||||
M.antagHUD = FALSE
|
||||
|
||||
/mob/dead/observer/verb/set_dnr()
|
||||
@@ -407,6 +412,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
var/choice = alert(src, "If you enable this, your body will be unrevivable for the remainder of the round.", "Are you sure?", "Yes", "No")
|
||||
if(choice == "Yes")
|
||||
to_chat(src, "<span class='boldnotice'>Do Not Revive state enabled.</span>")
|
||||
create_log(MISC_LOG, "DNR Enabled")
|
||||
can_reenter_corpse = FALSE
|
||||
if(!QDELETED(mind.current)) // Could change while they're choosing
|
||||
mind.current.med_hud_set_status()
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
/obj/item/mmi/robotic_brain/proc/check_observer(mob/dead/observer/O)
|
||||
if(cannotPossess(O))
|
||||
return FALSE
|
||||
if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept"))
|
||||
if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O, "nonhumandept"))
|
||||
return FALSE
|
||||
if(!O.can_reenter_corpse)
|
||||
return FALSE
|
||||
@@ -160,7 +160,7 @@
|
||||
if(cannotPossess(O))
|
||||
to_chat(O, "<span class='warning'>Upon using the antagHUD you forfeited the ability to join the round.</span>")
|
||||
return
|
||||
if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept"))
|
||||
if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O, "nonhumandept"))
|
||||
to_chat(O, "<span class='warning'>You are job banned from this role.</span>")
|
||||
return
|
||||
to_chat(O, "<span class='notice'>You've been added to the list of ghosts that may become this [src]. Click again to unvolunteer.</span>")
|
||||
|
||||
@@ -1042,7 +1042,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, list(/obj/machinery/atmospherics/unary/ven
|
||||
if(!forceFed(toEat, user, fullness))
|
||||
return 0
|
||||
consume(toEat, bitesize_override, can_taste_container = toEat.can_taste)
|
||||
GLOB.score_foodeaten++
|
||||
SSticker.score.score_food_eaten++
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/proc/selfFeed(obj/item/reagent_containers/food/toEat, fullness)
|
||||
|
||||
@@ -332,9 +332,6 @@
|
||||
else if(!client)
|
||||
msg += "[p_they(TRUE)] [p_have()] suddenly fallen asleep, suffering from Space Sleep Disorder. [p_they(TRUE)] may wake up soon.\n"
|
||||
|
||||
if(digitalcamo)
|
||||
msg += "[p_they(TRUE)] [p_are()] moving [p_their()] body in an unnatural and blatantly inhuman manner.\n"
|
||||
|
||||
if(!(skipface || ( wear_mask && ( wear_mask.flags_inv & HIDEFACE || wear_mask.flags_cover & MASKCOVERSMOUTH) ) ) && is_thrall(src) && in_range(user,src))
|
||||
msg += "Their features seem unnaturally tight and drawn.\n"
|
||||
|
||||
|
||||
@@ -1163,6 +1163,10 @@
|
||||
set src in view(1)
|
||||
var/self = 0
|
||||
|
||||
if (!ishuman(src))
|
||||
to_chat(usr, "<span class='notice'>You do not know how to check someone's pulse!</span>")
|
||||
return
|
||||
|
||||
if(usr.stat == 1 || usr.restrained() || !isliving(usr) || usr.is_dead()) return
|
||||
|
||||
if(usr == src)
|
||||
@@ -1192,8 +1196,10 @@
|
||||
|
||||
/mob/living/carbon/human/proc/change_dna(datum/dna/new_dna, include_species_change = FALSE, keep_flavor_text = FALSE)
|
||||
if(include_species_change)
|
||||
set_species(new_dna.species.type, retain_damage = TRUE)
|
||||
set_species(new_dna.species.type, retain_damage = TRUE, transformation = TRUE)
|
||||
dna = new_dna.Clone()
|
||||
if (include_species_change) //We have to call this after new_dna.Clone() so that species actions don't get overwritten
|
||||
dna.species.on_species_gain(src)
|
||||
real_name = new_dna.real_name
|
||||
domutcheck(src, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them
|
||||
if(!keep_flavor_text)
|
||||
@@ -1205,7 +1211,7 @@
|
||||
sec_hud_set_ID()
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/set_species(datum/species/new_species, default_colour, delay_icon_update = FALSE, skip_same_check = FALSE, retain_damage = FALSE)
|
||||
/mob/living/carbon/human/proc/set_species(datum/species/new_species, default_colour, delay_icon_update = FALSE, skip_same_check = FALSE, retain_damage = FALSE, transformation = FALSE)
|
||||
if(!skip_same_check)
|
||||
if(dna.species.name == initial(new_species.name))
|
||||
return
|
||||
@@ -1362,7 +1368,8 @@
|
||||
|
||||
dna.real_name = real_name
|
||||
|
||||
dna.species.on_species_gain(src)
|
||||
if (!transformation) //Distinguish between creating a mob and switching species
|
||||
dna.species.on_species_gain(src)
|
||||
|
||||
update_sight()
|
||||
|
||||
@@ -1737,7 +1744,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
|
||||
|
||||
if(G.trigger_guard == TRIGGER_GUARD_NORMAL)
|
||||
if(HAS_TRAIT(src, TRAIT_CHUNKYFINGERS))
|
||||
to_chat(src, "<span class='warning'>Your meaty finger is much too large for the trigger guard!</span>")
|
||||
to_chat(src, "<span class='warning'>Your meaty finger is far too large for the trigger guard!</span>")
|
||||
return FALSE
|
||||
|
||||
if(mind && mind.martial_art && mind.martial_art.no_guns) //great dishonor to famiry
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
var/relay_speech = FALSE
|
||||
var/use_static = TRUE
|
||||
var/static_visibility_range = 16
|
||||
// Decides if it is shown by AI Detector or not
|
||||
var/ai_detector_visible = TRUE
|
||||
|
||||
|
||||
// Use this when setting the aiEye's location.
|
||||
|
||||
@@ -368,7 +368,7 @@ GLOBAL_DATUM_INIT(paiController, /datum/paiController, new) // Global handler fo
|
||||
//question(O.client)
|
||||
|
||||
/datum/paiController/proc/check_recruit(mob/dead/observer/O)
|
||||
if(jobban_isbanned(O, ROLE_PAI) || jobban_isbanned(O,"nonhumandept"))
|
||||
if(jobban_isbanned(O, ROLE_PAI) || jobban_isbanned(O, "nonhumandept"))
|
||||
return 0
|
||||
if(!player_old_enough_antag(O.client,ROLE_PAI))
|
||||
return 0
|
||||
|
||||
@@ -1189,12 +1189,13 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
var/floor_only = TRUE
|
||||
for(var/A in tile)
|
||||
if(istype(A, /obj/effect))
|
||||
if(is_cleanable(A))
|
||||
var/obj/effect/decal/cleanable/blood/B = A
|
||||
var/obj/effect/E = A
|
||||
if(E.is_cleanable())
|
||||
var/obj/effect/decal/cleanable/blood/B = E
|
||||
if(istype(B) && B.off_floor)
|
||||
floor_only = FALSE
|
||||
else
|
||||
qdel(A)
|
||||
qdel(E)
|
||||
else if(istype(A, /obj/item))
|
||||
var/obj/item/cleaned_item = A
|
||||
cleaned_item.clean_blood()
|
||||
|
||||
@@ -551,7 +551,7 @@
|
||||
/obj/item/robot_module/miner/handle_custom_removal(component_id, mob/living/user, obj/item/W)
|
||||
if(component_id == "KA modkits")
|
||||
for(var/obj/item/gun/energy/kinetic_accelerator/cyborg/D in src)
|
||||
D.attackby(W, user)
|
||||
D.crowbar_act(user, W)
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
outfit = /datum/outfit/syndicatesoldiercorpse
|
||||
|
||||
/datum/outfit/syndicatesoldiercorpse
|
||||
name = "Syndicate Operative Corpse"
|
||||
name = "Corpse of a Syndicate Operative"
|
||||
uniform = /obj/item/clothing/under/syndicate
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
@@ -31,7 +31,7 @@
|
||||
outfit = /datum/outfit/syndicatecommandocorpse
|
||||
|
||||
/datum/outfit/syndicatecommandocorpse
|
||||
name = "Syndicate Commando Corpse"
|
||||
name = "Corpse of a Syndicate Commando"
|
||||
uniform = /obj/item/clothing/under/syndicate
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/syndi
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
@@ -59,7 +59,7 @@
|
||||
outfit = /datum/outfit/piratecorpse
|
||||
|
||||
/datum/outfit/piratecorpse
|
||||
name = "Pirate Corpse"
|
||||
name = "Corpse of a Pirate"
|
||||
uniform = /obj/item/clothing/under/pirate
|
||||
shoes = /obj/item/clothing/shoes/jackboots
|
||||
glasses = /obj/item/clothing/glasses/eyepatch
|
||||
@@ -72,7 +72,7 @@
|
||||
outfit = /datum/outfit/piratecorpse/ranged
|
||||
|
||||
/datum/outfit/piratecorpse/ranged
|
||||
name = "Pirate Gunner Corpse"
|
||||
name = "Corpse of a Pirate Gunner"
|
||||
suit = /obj/item/clothing/suit/pirate_black
|
||||
head = /obj/item/clothing/head/pirate
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
outfit = /datum/outfit/russiancorpse
|
||||
|
||||
/datum/outfit/russiancorpse
|
||||
name = "Russian Corpse"
|
||||
name = "Corpse of a Russian"
|
||||
uniform = /obj/item/clothing/under/soviet
|
||||
shoes = /obj/item/clothing/shoes/jackboots
|
||||
head = /obj/item/clothing/head/bearpelt
|
||||
@@ -95,12 +95,12 @@
|
||||
outfit = /datum/outfit/russiancorpse/ranged
|
||||
|
||||
/datum/outfit/russiancorpse/ranged
|
||||
name = "Ranged Russian Corpse"
|
||||
name = "Corpse of a Ranged Russian"
|
||||
head = /obj/item/clothing/head/ushanka
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/wizard
|
||||
name = "Space Wizard Corpse"
|
||||
name = "Corpse of a Space Wizard"
|
||||
outfit = /datum/outfit/wizardcorpse
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/clownoff/Initialize(mapload)
|
||||
@@ -108,7 +108,7 @@
|
||||
. = ..()
|
||||
|
||||
/datum/outfit/wizardcorpse
|
||||
name = "Space Wizard Corpse"
|
||||
name = "Corpse of a Space Wizard"
|
||||
uniform = /obj/item/clothing/under/color/lightpurple
|
||||
suit = /obj/item/clothing/suit/wizrobe
|
||||
shoes = /obj/item/clothing/shoes/sandal
|
||||
|
||||
@@ -189,7 +189,7 @@ Difficulty: Very Hard
|
||||
var/turf/target_turf = get_turf(target)
|
||||
playsound(src, 'sound/magic/clockwork/invoke_general.ogg', 200, TRUE, 2)
|
||||
newtonian_move(get_dir(target_turf, src))
|
||||
var/angle_to_target = Get_Angle(src, target_turf)
|
||||
var/angle_to_target = get_angle(src, target_turf)
|
||||
if(isnum(set_angle))
|
||||
angle_to_target = set_angle
|
||||
var/static/list/colossus_shotgun_shot_angles = list(12.5, 7.5, 2.5, -2.5, -7.5, -12.5)
|
||||
|
||||
@@ -28,8 +28,8 @@
|
||||
error_on_humanize = "Dead spiders are not player-controllable."
|
||||
else if(!(user in GLOB.respawnable_list))
|
||||
error_on_humanize = "You are not able to rejoin the round."
|
||||
if(jobban_isbanned(user, "Syndicate") || jobban_isbanned(user, "alien"))
|
||||
to_chat(user,"You are jobbanned from role of syndicate and/or alien lifeform.")
|
||||
if(jobban_isbanned(user, ROLE_SYNDICATE) || jobban_isbanned(user, ROLE_TSPIDER))
|
||||
to_chat(user, "<span class='warning'>You are jobbanned from role of syndicate and/or terror spider.</span>")
|
||||
return
|
||||
if(error_on_humanize == "")
|
||||
var/spider_ask = alert(humanize_prompt, "Join as Terror Spider?", "Yes", "No")
|
||||
|
||||
@@ -689,18 +689,25 @@
|
||||
clean_speak = list(
|
||||
"Poly wanna cracker!",
|
||||
"Check the crystal, you chucklefucks!",
|
||||
"Check the tesla, you shits!",
|
||||
"STOP HOT-WIRING THE ENGINE, FUCKING CHRIST!",
|
||||
"Wire the solars, you lazy bums!",
|
||||
"WHO TOOK THE DAMN HARDSUITS?",
|
||||
"OH GOD ITS ABOUT TO DELAMINATE CALL THE SHUTTLE",
|
||||
"Why are there so many atmos alerts?",
|
||||
"OH GOD WHY WOULD YOU PUT CARBON-DIOXIDE IN THE SM?",
|
||||
"OH GOD WHY WOULD YOU PUT PLASMA IN THE SM?",
|
||||
"Remember to lock the emitters!",
|
||||
"Stop goofing off and repair the goddam station!",
|
||||
"The supermatter is not your friend!",
|
||||
"What were the wires again?",
|
||||
"Goddam emaggers!"
|
||||
"Goddam emaggers!",
|
||||
"Why is nobody watching the engine?",
|
||||
"Maybe the SM would produce more power if we fed it some clowns.",
|
||||
"Everyone else dusted when they touched the SM, but I am sure you will be different.",
|
||||
"I asked the mime if they turned off the scrubbers, but they didn't say a word.",
|
||||
"This engine setup meets all safety requirements.",
|
||||
"Chief Engineers are the SM's natural diet.",
|
||||
"Don't eat the forbidden nacho!",
|
||||
"Is the engine meant to be making that noise?",
|
||||
)
|
||||
unique_pet = TRUE
|
||||
gold_core_spawnable = NO_SPAWN
|
||||
@@ -708,6 +715,7 @@
|
||||
/mob/living/simple_animal/parrot/Poly/New()
|
||||
ears = new /obj/item/radio/headset/headset_eng(src)
|
||||
available_channels = list(":e")
|
||||
clean_speak += "Danger! Crystal hyperstructure integrity faltering! Integrity: [rand(75, 99)]%" // Has to be here cause of the `rand()`.
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/parrot/handle_message_mode(message_mode, list/message_pieces, verb, used_radios)
|
||||
|
||||
@@ -890,7 +890,8 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
|
||||
if(href_list["flavor_change"])
|
||||
update_flavor_text()
|
||||
|
||||
return
|
||||
if(href_list["scoreboard"])
|
||||
usr << browse(GLOB.scoreboard, "window=roundstats;size=500x600")
|
||||
|
||||
// The src mob is trying to strip an item from someone
|
||||
// Defined in living.dm
|
||||
|
||||
@@ -299,7 +299,7 @@
|
||||
if(ispath(MP, /mob/living/simple_animal/butterfly))
|
||||
return 1
|
||||
|
||||
if(ispath(MP, /mob/living/simple_animal/borer) && !jobban_isbanned(src, ROLE_BORER) && !jobban_isbanned(src, "Syndicate"))
|
||||
if(ispath(MP, /mob/living/simple_animal/borer) && !jobban_isbanned(src, ROLE_BORER) && !jobban_isbanned(src, ROLE_SYNDICATE))
|
||||
return 1
|
||||
|
||||
if(ispath(MP, /mob/living/simple_animal/diona) && !jobban_isbanned(src, ROLE_NYMPH))
|
||||
|
||||
@@ -137,7 +137,6 @@
|
||||
*/
|
||||
/obj/item/pen/edagger
|
||||
origin_tech = "combat=3;syndicate=1"
|
||||
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") //these wont show up if the pen is off
|
||||
var/on = 0
|
||||
var/brightness_on = 2
|
||||
light_color = LIGHT_COLOR_RED
|
||||
@@ -149,6 +148,7 @@
|
||||
sharp = 0
|
||||
w_class = initial(w_class)
|
||||
name = initial(name)
|
||||
attack_verb = list()
|
||||
hitsound = initial(hitsound)
|
||||
embed_chance = initial(embed_chance)
|
||||
throwforce = initial(throwforce)
|
||||
@@ -161,6 +161,7 @@
|
||||
sharp = 1
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
name = "energy dagger"
|
||||
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
hitsound = 'sound/weapons/blade1.ogg'
|
||||
embed_chance = 100 //rule of cool
|
||||
throwforce = 35
|
||||
|
||||
@@ -113,6 +113,7 @@
|
||||
updateUsrDialog()
|
||||
else if(check_ass())
|
||||
to_chat(ass, "<span class='notice'>You feel a slight pressure on your ass.</span>")
|
||||
atom_say("Attention: Unable to remove large object!")
|
||||
updateUsrDialog()
|
||||
else if(href_list["min"])
|
||||
if(copies > 1)
|
||||
@@ -240,6 +241,7 @@
|
||||
var/icon/temp_img
|
||||
if(!check_ass()) //You have to be sitting on the copier and either be a xeno or a human without clothes on.
|
||||
return
|
||||
atom_say("Attention: Posterior Placed on Printing Plaque!")
|
||||
if(emagged)
|
||||
if(ishuman(ass))
|
||||
var/mob/living/carbon/human/H = ass
|
||||
@@ -314,7 +316,6 @@
|
||||
toner = 0
|
||||
|
||||
/obj/machinery/photocopier/MouseDrop_T(mob/target, mob/user)
|
||||
check_ass() //Just to make sure that you can re-drag somebody onto it after they moved off.
|
||||
if(!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai) || target == ass)
|
||||
return
|
||||
src.add_fingerprint(user)
|
||||
@@ -332,7 +333,7 @@
|
||||
copyitem = null
|
||||
updateUsrDialog()
|
||||
|
||||
/obj/machinery/photocopier/proc/check_ass() //I'm not sure wether I made this proc because it's good form or because of the name.
|
||||
/obj/machinery/photocopier/proc/check_ass() //I'm not sure whether I made this proc because it's good form or because of the name.
|
||||
if(!ass)
|
||||
return 0
|
||||
if(ass.loc != src.loc)
|
||||
@@ -341,7 +342,6 @@
|
||||
return 0
|
||||
else
|
||||
playsound(loc, 'sound/machines/ping.ogg', 50, 0)
|
||||
atom_say("Attention: Posterior Placed on Printing Plaque!")
|
||||
return 1
|
||||
|
||||
/obj/machinery/photocopier/emag_act(user as mob)
|
||||
|
||||
@@ -105,6 +105,8 @@
|
||||
var/global/list/status_overlays_environ
|
||||
var/indestructible = 0 // If set, prevents aliens from destroying it
|
||||
var/keep_preset_name = 0
|
||||
/// Was this APC built instead of already existing? Used for malfhack to keep borgs from building apcs in space
|
||||
var/constructed = FALSE
|
||||
|
||||
var/report_power_alarm = TRUE
|
||||
|
||||
@@ -171,14 +173,13 @@
|
||||
operating = 0
|
||||
name = "[area.name] APC"
|
||||
stat |= MAINT
|
||||
constructed = TRUE
|
||||
update_icon()
|
||||
addtimer(CALLBACK(src, .proc/update), 5)
|
||||
|
||||
/obj/machinery/power/apc/Destroy()
|
||||
SStgui.close_uis(wires)
|
||||
GLOB.apcs -= src
|
||||
if(malfai && operating)
|
||||
malfai.malf_picker.processing_time = clamp(malfai.malf_picker.processing_time - 10,0,1000)
|
||||
area.power_light = 0
|
||||
area.power_equip = 0
|
||||
area.power_environ = 0
|
||||
@@ -973,6 +974,9 @@
|
||||
if(malf.malfhacking)
|
||||
to_chat(malf, "You are already hacking an APC.")
|
||||
return
|
||||
if(constructed)
|
||||
to_chat(malf, "<span class='warning'>This APC was only recently constructed, and is not fully linked to station systems. Hacking it would be pointless.</span>")
|
||||
return
|
||||
to_chat(malf, "Beginning override of APC systems. This takes some time, and you cannot perform other actions during the process.")
|
||||
malf.malfhack = src
|
||||
malf.malfhacking = addtimer(CALLBACK(malf, /mob/living/silicon/ai/.proc/malfhacked, src), 600, TIMER_STOPPABLE)
|
||||
|
||||
@@ -354,3 +354,9 @@
|
||||
desc = "A standard ninja-suit power cell."
|
||||
maxcharge = 10000
|
||||
materials = list(MAT_GLASS = 60)
|
||||
|
||||
/obj/item/stock_parts/cell/bsg
|
||||
name = "\improper B.S.G power cell"
|
||||
desc = "A high capacity, slow charging cell for the B.S.G."
|
||||
maxcharge = 40000
|
||||
chargerate = 2600 // about 30 seconds to charge with a default recharger
|
||||
|
||||
@@ -578,7 +578,7 @@
|
||||
|
||||
if(prot > 0 || HAS_TRAIT(user, TRAIT_RESISTHEAT) || HAS_TRAIT(user, TRAIT_RESISTHEATHANDS))
|
||||
to_chat(user, "<span class='notice'>You remove the light [fitting]</span>")
|
||||
else if(user.dna?.GetSEState(GLOB.teleblock))
|
||||
else if(HAS_TRAIT(user, TRAIT_TELEKINESIS))
|
||||
to_chat(user, "<span class='notice'>You telekinetically remove the light [fitting].</span>")
|
||||
else
|
||||
if(user.a_intent == INTENT_DISARM || user.a_intent == INTENT_GRAB)
|
||||
|
||||
@@ -116,7 +116,7 @@
|
||||
// it might mean we are stuck in a corner somewere. So move around to try to expand.
|
||||
move()
|
||||
if(current_size >= STAGE_TWO)
|
||||
radiation_pulse(src, min(5000, (energy * 4.5) + 1000), RAD_DISTANCE_COEFFICIENT * 0.5)
|
||||
radiation_pulse(src, min(5000, (energy * 4.5) + 1000), RAD_DISTANCE_COEFFICIENT * 0.1)
|
||||
if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit
|
||||
event()
|
||||
eat()
|
||||
|
||||
@@ -101,7 +101,7 @@
|
||||
overlays += image('icons/obj/power.dmi', icon_state = "solar_panel-b", layer = FLY_LAYER)
|
||||
else
|
||||
overlays += image('icons/obj/power.dmi', icon_state = "solar_panel", layer = FLY_LAYER)
|
||||
src.dir = angle2dir(adir)
|
||||
set_angle(adir)
|
||||
return
|
||||
|
||||
//calculates the fraction of the sunlight that the panel recieves
|
||||
@@ -298,7 +298,7 @@
|
||||
if(autostart)
|
||||
search_for_connected()
|
||||
if(connected_tracker && track == TRACKER_AUTO)
|
||||
connected_tracker.set_angle(SSsun.angle)
|
||||
connected_tracker.modify_angle(SSsun.angle)
|
||||
set_panels(cdir)
|
||||
|
||||
/obj/machinery/power/solar_control/Destroy()
|
||||
@@ -338,7 +338,7 @@
|
||||
return
|
||||
|
||||
if(track == TRACKER_AUTO && connected_tracker) // auto-tracking
|
||||
connected_tracker.set_angle(SSsun.angle)
|
||||
connected_tracker.modify_angle(SSsun.angle)
|
||||
set_panels(cdir)
|
||||
updateDialog()
|
||||
|
||||
@@ -410,7 +410,7 @@
|
||||
track = text2num(params["track"])
|
||||
if(track == TRACKER_AUTO)
|
||||
if(connected_tracker)
|
||||
connected_tracker.set_angle(SSsun.angle)
|
||||
connected_tracker.modify_angle(SSsun.angle)
|
||||
set_panels(cdir)
|
||||
else if(track == TRACKER_TIMED)
|
||||
targetdir = cdir
|
||||
@@ -420,7 +420,7 @@
|
||||
if("refresh")
|
||||
search_for_connected()
|
||||
if(connected_tracker && track == TRACKER_AUTO)
|
||||
connected_tracker.set_angle(SSsun.angle)
|
||||
connected_tracker.modify_angle(SSsun.angle)
|
||||
set_panels(cdir)
|
||||
|
||||
/obj/machinery/power/solar_control/attackby(obj/item/I, mob/user, params)
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
update_icon()
|
||||
|
||||
//updates the tracker icon and the facing angle for the control computer
|
||||
/obj/machinery/power/tracker/proc/set_angle(angle)
|
||||
/obj/machinery/power/tracker/proc/modify_angle(angle)
|
||||
sun_angle = angle
|
||||
|
||||
//set icon dir to show sun illumination
|
||||
|
||||
@@ -271,6 +271,16 @@
|
||||
delay = 50
|
||||
select_name = "snipe"
|
||||
|
||||
/obj/item/ammo_casing/energy/bsg
|
||||
projectile_type = /obj/item/projectile/energy/bsg
|
||||
muzzle_flash_color = LIGHT_COLOR_DARKBLUE
|
||||
muzzle_flash_range = MUZZLE_FLASH_RANGE_STRONG
|
||||
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_STRONG
|
||||
fire_sound = 'sound/weapons/wave.ogg'
|
||||
e_cost = 10000
|
||||
select_name = "the experimental setting"
|
||||
delay = 10 SECONDS //Looooooong cooldown
|
||||
|
||||
/obj/item/ammo_casing/energy/teleport
|
||||
projectile_type = /obj/item/projectile/energy/teleport
|
||||
muzzle_flash_color = LIGHT_COLOR_LIGHTBLUE
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
var/selfcharge = 0
|
||||
var/charge_tick = 0
|
||||
var/charge_delay = 4
|
||||
/// Do you want the gun to fit into a turret, defaults to true, used for if a energy gun is too strong to be in a turret, or does not make sense to be in one.
|
||||
var/can_fit_in_turrets = TRUE
|
||||
|
||||
/obj/item/gun/energy/emp_act(severity)
|
||||
cell.use(round(cell.charge / severity))
|
||||
|
||||
@@ -275,7 +275,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/borg/upgrade/modkit/action(mob/living/silicon/robot/R)
|
||||
if(..())
|
||||
if(!..())
|
||||
return
|
||||
|
||||
for(var/obj/item/gun/energy/kinetic_accelerator/cyborg/H in R.module.modules)
|
||||
|
||||
@@ -317,6 +317,121 @@
|
||||
zoom_amt = 7 //Long range, enough to see in front of you, but no tiles behind you.
|
||||
shaded_charge = 1
|
||||
|
||||
/obj/item/gun/energy/bsg
|
||||
name = "\improper B.S.G"
|
||||
desc = "The Blue Space Gun. Uses a flux anomaly core and a bluespace crystal to produce destructive bluespace energy blasts, inspired by Nanotrasen's BSA division."
|
||||
icon_state = "bsg"
|
||||
item_state = "bsg"
|
||||
origin_tech = "combat=6;materials=6;powerstorage=6;bluespace=6;magnets=6" //cutting edge technology, be my guest if you want to deconstruct one instead of use it.
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/bsg)
|
||||
weapon_weight = WEAPON_HEAVY
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
can_holster = FALSE
|
||||
slot_flags = SLOT_BACK
|
||||
cell_type = /obj/item/stock_parts/cell/bsg
|
||||
shaded_charge = TRUE
|
||||
can_fit_in_turrets = FALSE //Crystal would shatter, or someone would try to put an empty gun in the frame.
|
||||
var/obj/item/assembly/signaler/anomaly/flux/core = null
|
||||
var/has_bluespace_crystal = FALSE
|
||||
var/admin_model = FALSE //For the admin gun, prevents crystal shattering, so anyone can use it, and you dont need to carry backup crystals.
|
||||
|
||||
/obj/item/gun/energy/bsg/Destroy()
|
||||
QDEL_NULL(core)
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/energy/bsg/examine(mob/user)
|
||||
. = ..()
|
||||
if(core && has_bluespace_crystal)
|
||||
. += "<span class='notice'>[src] is fully operational!</span>"
|
||||
else if(core)
|
||||
. += "<span class='warning'>It has a flux anomaly core installed, but no bluespace crystal installed.</span>"
|
||||
else if(has_bluespace_crystal)
|
||||
. += "<span class='warning'>It has a bluespace crystal installed, but no flux anomaly core installed.</span>"
|
||||
else
|
||||
. += "<span class='warning'>It is missing a flux anomaly core and bluespace crystal to be operational.</span>"
|
||||
|
||||
/obj/item/gun/energy/bsg/attackby(obj/item/O, mob/user, params)
|
||||
if(istype(O, /obj/item/stack/ore/bluespace_crystal))
|
||||
if(has_bluespace_crystal)
|
||||
to_chat(user, "<span class='notice'>[src] already has a bluespace crystal installed.</span>")
|
||||
return
|
||||
var/obj/item/stack/S = O
|
||||
if(!loc || !S || S.get_amount() < 1)
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You load [O] into [src].</span>")
|
||||
S.use(1)
|
||||
has_bluespace_crystal = TRUE
|
||||
update_icon()
|
||||
return
|
||||
|
||||
if(istype(O, /obj/item/assembly/signaler/anomaly/flux))
|
||||
if(core)
|
||||
to_chat(user, "<span class='notice'>[src] already has a [O]!</span>")
|
||||
return
|
||||
if(!user.drop_item())
|
||||
to_chat(user, "<span class='warning'>[O] is stuck to your hand!</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You insert [O] into [src], and [src] starts to warm up.</span>")
|
||||
O.forceMove(src)
|
||||
core = O
|
||||
update_icon()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/energy/bsg/process_fire(atom/target, mob/living/user, message = TRUE, params, zone_override, bonus_spread = 0)
|
||||
if(!has_bluespace_crystal)
|
||||
to_chat(user, "<span class='warning'>[src] has no bluespace crystal to power it!</span>")
|
||||
return
|
||||
if(!core)
|
||||
to_chat(user, "<span class='warning'>[src] has no flux anomaly core to power it!</span>")
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/energy/bsg/process_chamber()
|
||||
if(prob(25))
|
||||
shatter()
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/item/gun/energy/bsg/update_icon()
|
||||
. = ..()
|
||||
if(core)
|
||||
if(has_bluespace_crystal)
|
||||
icon_state = "bsg_finished"
|
||||
else
|
||||
icon_state = "bsg_core"
|
||||
else if(has_bluespace_crystal)
|
||||
icon_state = "bsg_crystal"
|
||||
else
|
||||
icon_state = "bsg"
|
||||
|
||||
/obj/item/gun/energy/bsg/emp_act(severity)
|
||||
..()
|
||||
if(prob(75 / severity))
|
||||
if(has_bluespace_crystal)
|
||||
shatter()
|
||||
|
||||
/obj/item/gun/energy/bsg/proc/shatter()
|
||||
if(admin_model)
|
||||
return
|
||||
visible_message("<span class='warning'>[src]'s bluespace crystal shatters!</span>")
|
||||
playsound(src, 'sound/effects/pylon_shatter.ogg', 50, TRUE)
|
||||
has_bluespace_crystal = FALSE
|
||||
update_icon()
|
||||
|
||||
/obj/item/gun/energy/bsg/prebuilt
|
||||
icon_state = "bsg_finished"
|
||||
has_bluespace_crystal = TRUE
|
||||
|
||||
/obj/item/gun/energy/bsg/prebuilt/Initialize(mapload)
|
||||
. = ..()
|
||||
core = new /obj/item/assembly/signaler/anomaly/flux
|
||||
update_icon()
|
||||
|
||||
/obj/item/gun/energy/bsg/prebuilt/admin
|
||||
desc = "The Blue Space Gun. Uses a flux anomaly core and a bluespace crystal to produce destructive bluespace energy blasts, inspired by Nanotrasen's BSA division. This is an executive model, and its bluespace crystal will not shatter."
|
||||
admin_model = TRUE
|
||||
|
||||
// Temperature Gun //
|
||||
/obj/item/gun/energy/temperature
|
||||
name = "temperature gun"
|
||||
|
||||
@@ -60,6 +60,9 @@
|
||||
|
||||
var/log_override = FALSE //whether print to admin attack logs or just keep it in the diary
|
||||
|
||||
/// For when you want your projectile to have a chain coming out of the gun
|
||||
var/chain = null
|
||||
|
||||
/obj/item/projectile/New()
|
||||
permutated = list()
|
||||
return ..()
|
||||
@@ -239,7 +242,7 @@
|
||||
if((!current || loc == current))
|
||||
current = locate(clamp(x + xo, 1, world.maxx), clamp(y + yo, 1, world.maxy), z)
|
||||
if(isnull(Angle))
|
||||
Angle = round(Get_Angle(src, current))
|
||||
Angle = round(get_angle(src, current))
|
||||
if(spread)
|
||||
Angle += (rand() - 0.5) * spread
|
||||
var/matrix/M = new
|
||||
|
||||
@@ -80,7 +80,6 @@
|
||||
var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE
|
||||
var/zap_range = 3
|
||||
var/power = 10000
|
||||
var/chain
|
||||
|
||||
/obj/item/ammo_casing/energy/shock_revolver/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
|
||||
..()
|
||||
@@ -93,6 +92,62 @@
|
||||
tesla_zap(src, zap_range, power, zap_flags)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/projectile/energy/bsg
|
||||
name = "orb of pure bluespace energy"
|
||||
icon_state = "bluespace"
|
||||
impact_effect_type = /obj/effect/temp_visual/bsg_kaboom
|
||||
damage = 60
|
||||
damage_type = BURN
|
||||
range = 9
|
||||
weaken = 1 //This is going to knock you off your feet
|
||||
eyeblur = 5
|
||||
speed = 2
|
||||
alwayslog = TRUE
|
||||
|
||||
/obj/item/ammo_casing/energy/bsg/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
|
||||
..()
|
||||
var/obj/item/projectile/energy/bsg/P = BB
|
||||
addtimer(CALLBACK(P, /obj/item/projectile/energy/bsg/.proc/make_chain, P, user), 1)
|
||||
|
||||
/obj/item/projectile/energy/bsg/proc/make_chain(obj/item/projectile/P, mob/user)
|
||||
P.chain = P.Beam(user, icon_state = "sm_arc_supercharged", icon = 'icons/effects/beam.dmi', time = 10 SECONDS, maxdistance = 30)
|
||||
|
||||
/obj/item/projectile/energy/bsg/on_hit(atom/target)
|
||||
. = ..()
|
||||
kaboom()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/projectile/energy/bsg/on_range()
|
||||
kaboom()
|
||||
new /obj/effect/temp_visual/bsg_kaboom(loc)
|
||||
..()
|
||||
|
||||
/obj/item/projectile/energy/bsg/proc/kaboom()
|
||||
playsound(src, 'sound/weapons/bsg_explode.ogg', 75, TRUE)
|
||||
for(var/mob/living/M in hearers(7, src)) //No stuning people with thermals through a wall.
|
||||
var/floored = FALSE
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/gun/energy/bsg/N = locate() in H
|
||||
if(N)
|
||||
to_chat(H, "<span class='notice'>[N] deploys an energy shield to project you from [src]'s explosion.</span>")
|
||||
continue
|
||||
var/distance = (1 + get_dist(M, src))
|
||||
if(prob(min(400 / distance, 100))) //100% chance to hit with the blast up to 3 tiles, after that chance to hit is 80% at 4 tiles, 66.6% at 5, 57% at 6, and 50% at 7
|
||||
if(prob(min(150 / distance, 100)))//100% chance to upgraded to a stun as well at a direct hit, 75% at 1 tile, 50% at 2, 37.5% at 3, 30% at 4, 25% at 5, 21% at 6, and finaly 19% at 7. This is calculated after the first hit however.
|
||||
floored = TRUE
|
||||
M.apply_damage((rand(15, 30) * (1.1 - distance / 10)), BURN) //reduced by 10% per tile
|
||||
add_attack_logs(src, M, "Hit heavily by [src]")
|
||||
if(floored)
|
||||
to_chat(M, "<span class='userdanger'>You see a flash of briliant blue light as [src] explodes, knocking you to the ground and burning you!</span>")
|
||||
M.Weaken(1)
|
||||
else
|
||||
to_chat(M, "<span class='userdanger'>You see a flash of briliant blue light as [src] explodes, burning you!</span>")
|
||||
else
|
||||
to_chat(M, "<span class='userdanger'>You feel the heat of the explosion of [src], but the blast mostly misses you.</span>")
|
||||
add_attack_logs(src, M, "Hit lightly by [src]")
|
||||
M.apply_damage(rand(1, 5), BURN)
|
||||
|
||||
/obj/item/projectile/energy/toxplasma
|
||||
name = "plasma bolt"
|
||||
icon_state = "energy"
|
||||
|
||||
@@ -246,7 +246,7 @@
|
||||
|
||||
if(!operating)
|
||||
for (var/obj/item/O in holdingitems)
|
||||
processing_chamber += "\A [O.name]<BR>"
|
||||
processing_chamber += "\A [html_encode(O.name)]<BR>"
|
||||
|
||||
if (!processing_chamber)
|
||||
is_chamber_empty = 1
|
||||
|
||||
@@ -688,6 +688,25 @@
|
||||
M.bodytemperature = min(330, M.bodytemperature + (20 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/adminfreeze
|
||||
name = "Admin Freeze"
|
||||
id = "adminfreeze"
|
||||
description = "Ultimate Punishment."
|
||||
reagent_state = LIQUID
|
||||
color = "#30F0FF" // rgb: 048, 240, 255
|
||||
dizzy_adj = 4
|
||||
alcohol_perc = 1.5 // oof
|
||||
drink_icon = "adminfreeze"
|
||||
drink_name = "Admin Freeze"
|
||||
drink_desc = "The ultimate punishment."
|
||||
taste_description = "a series of bad decisions"
|
||||
|
||||
/datum/reagent/consumable/ethanol/adminfreeze/reaction_mob(mob/living/M, method = REAGENT_INGEST, volume)
|
||||
..()
|
||||
if(method == REAGENT_INGEST)
|
||||
M.apply_status_effect(/datum/status_effect/freon/watcher)
|
||||
M.adjust_bodytemperature(-110)
|
||||
|
||||
/datum/reagent/consumable/ethanol/barefoot
|
||||
name = "Barefoot"
|
||||
id = "barefoot"
|
||||
|
||||
@@ -442,7 +442,7 @@
|
||||
if(!istype(C))
|
||||
return
|
||||
if(C.mind)
|
||||
if(C.mind.assigned_role == "Clown" || C.mind.assigned_role == SPECIAL_ROLE_HONKSQUAD)
|
||||
if(C.mind.assigned_role == "Clown")
|
||||
to_chat(C, "<span class='notice'>Whatever that was, it feels great!</span>")
|
||||
else if(C.mind.assigned_role == "Mime")
|
||||
to_chat(C, "<span class='warning'>You feel nauseous.</span>")
|
||||
@@ -460,7 +460,7 @@
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
if(prob(10))
|
||||
M.emote("giggle")
|
||||
if(M?.mind.assigned_role == "Clown" || M?.mind.assigned_role == SPECIAL_ROLE_HONKSQUAD)
|
||||
if(M?.mind.assigned_role == "Clown")
|
||||
update_flags |= M.adjustBruteLoss(-1.5 * REAGENTS_EFFECT_MULTIPLIER) //Screw those pesky clown beatings!
|
||||
else
|
||||
M.AdjustDizzy(10, 0, 500)
|
||||
|
||||
@@ -57,10 +57,12 @@
|
||||
taste_description = "floor cleaner"
|
||||
|
||||
/datum/reagent/space_cleaner/reaction_obj(obj/O, volume)
|
||||
if(is_cleanable(O))
|
||||
var/obj/effect/decal/cleanable/blood/B = O
|
||||
if(!(istype(B) && B.off_floor))
|
||||
qdel(O)
|
||||
if(istype(O, /obj/effect))
|
||||
var/obj/effect/E = O
|
||||
if(E.is_cleanable())
|
||||
var/obj/effect/decal/cleanable/blood/B = E
|
||||
if(!(istype(B) && B.off_floor))
|
||||
qdel(E)
|
||||
else
|
||||
if(O.simulated)
|
||||
O.color = initial(O.color)
|
||||
|
||||
@@ -443,6 +443,15 @@
|
||||
result_amount = 4
|
||||
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
|
||||
|
||||
/datum/chemical_reaction/adminfreeze
|
||||
name = "Admin Freeze"
|
||||
id = "adminfreeze"
|
||||
result = "adminfreeze"
|
||||
required_reagents = list("neurotoxin" = 1, "toxinsspecial" = 1, "fernet" = 1, "moonshine" = 1, "morphine" = 1)
|
||||
min_temp = T0C + 100
|
||||
result_amount = 5
|
||||
mix_sound = 'sound/effects/adminhelp.ogg'
|
||||
|
||||
/datum/chemical_reaction/barefoot
|
||||
name = "Barefoot"
|
||||
id = "barefoot"
|
||||
|
||||
@@ -18,7 +18,8 @@
|
||||
return FALSE
|
||||
bitesize = 0
|
||||
if(M.eat(src, user))
|
||||
user.drop_item()
|
||||
if(user.get_active_hand() == src)
|
||||
user.drop_item() // Only drop if they're holding the patch directly
|
||||
forceMove(M)
|
||||
LAZYADD(M.processing_patches, src)
|
||||
return TRUE
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "camera_target"
|
||||
var/allowed_area = null
|
||||
// The Xenobio Console does not trigger the AI Detector
|
||||
ai_detector_visible = FALSE
|
||||
|
||||
/mob/camera/aiEye/remote/xenobio/New(loc)
|
||||
var/area/A = get_area(loc)
|
||||
|
||||
@@ -194,7 +194,7 @@
|
||||
|
||||
/obj/structure/puzzle_element
|
||||
name = "mysterious pillar"
|
||||
desc = "puzzling..."
|
||||
desc = "Puzzling..."
|
||||
icon = 'icons/obj/lavaland/artefacts.dmi'
|
||||
icon_state = "puzzle_pillar"
|
||||
anchored = FALSE
|
||||
|
||||
@@ -264,6 +264,8 @@
|
||||
visible_icon = FALSE
|
||||
use_static = FALSE
|
||||
simulated = FALSE
|
||||
// The Shuttle Docker does not trigger the AI Detector
|
||||
ai_detector_visible = FALSE
|
||||
var/list/placement_images = list()
|
||||
var/list/placed_images = list()
|
||||
|
||||
|
||||
@@ -64,8 +64,9 @@
|
||||
|
||||
/obj/item/organ/internal/heart/prepare_eat()
|
||||
var/obj/S = ..()
|
||||
S.icon_state = dead_icon
|
||||
return S
|
||||
if(S)
|
||||
S.icon_state = dead_icon
|
||||
return S
|
||||
|
||||
/obj/item/organ/internal/heart/cursed
|
||||
name = "cursed heart"
|
||||
|
||||
@@ -304,8 +304,9 @@
|
||||
|
||||
/obj/item/organ/internal/lungs/prepare_eat()
|
||||
var/obj/S = ..()
|
||||
S.reagents.add_reagent("salbutamol", 5)
|
||||
return S
|
||||
if(S)
|
||||
S.reagents.add_reagent("salbutamol", 5)
|
||||
return S
|
||||
|
||||
/obj/item/organ/internal/lungs/plasmaman
|
||||
name = "plasma filter"
|
||||
|
||||
@@ -38,5 +38,6 @@
|
||||
|
||||
data["isAI"] = isAI(user)
|
||||
data["crewmembers"] = GLOB.crew_repository.health_data(T)
|
||||
data["critThreshold"] = HEALTH_THRESHOLD_CRIT
|
||||
|
||||
return data
|
||||
|
||||
@@ -113,6 +113,6 @@
|
||||
return STATUS_CLOSE // Otherwise, we got nothing.
|
||||
|
||||
/mob/living/carbon/human/shared_living_ui_distance(atom/movable/src_object)
|
||||
if(dna.GetSEState(GLOB.teleblock) && (get_dist(src, src_object) <= 2))
|
||||
if(HAS_TRAIT(src, TRAIT_TELEKINESIS) && (get_dist(src, src_object) <= 2))
|
||||
return STATUS_INTERACTIVE
|
||||
return ..()
|
||||
|
||||
@@ -49,9 +49,9 @@
|
||||
var/turf/tile = loc
|
||||
if(isturf(tile))
|
||||
tile.clean_blood()
|
||||
for(var/A in tile)
|
||||
if(is_cleanable(A))
|
||||
qdel(A)
|
||||
for(var/obj/effect/E in tile)
|
||||
if(E.is_cleanable())
|
||||
qdel(E)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -19,8 +19,9 @@
|
||||
if(!C)
|
||||
return json_encode(list("error" = "No client with that name on server"))
|
||||
|
||||
var/message = "<font color='red'>Discord PM from <b><a href='?discord_msg=1'>[input["sender"]]</a></b>: [input["msg"]]</font>"
|
||||
var/amessage = "<font color='blue'>Discord PM from <a href='?discord_msg=1'>[input["sender"]]</a> to <b>[key_name_admin(C)]</b>: [input["msg"]]</font>"
|
||||
var/sanitized = sanitize(input["msg"])
|
||||
var/message = "<font color='red'>Discord PM from <b><a href='?discord_msg=1'>[input["sender"]]</a></b>: [sanitized]</font>"
|
||||
var/amessage = "<font color='blue'>Discord PM from <a href='?discord_msg=1'>[input["sender"]]</a> to <b>[key_name_admin(C)]</b>: [sanitized]</font>"
|
||||
|
||||
// THESE TWO VARS DO VERY DIFFERENT THINGS. DO NOT ATTEMPT TO COMBINE THEM
|
||||
C.received_discord_pm = world.time
|
||||
|
||||
Reference in New Issue
Block a user