Merge branch 'master' into upstream-merge-36974

This commit is contained in:
deathride58
2018-04-10 07:48:12 +00:00
committed by GitHub
860 changed files with 25708 additions and 23355 deletions
-3
View File
@@ -94,9 +94,6 @@
SSnetworks.station_network.add_log("Quantum relay manually [enabled ? "enabled" : "disabled"].")
update_icon()
/obj/machinery/ntnet_relay/attack_hand(mob/living/user)
ui_interact(user)
/obj/machinery/ntnet_relay/Initialize()
uid = gl_uid++
component_parts = list()
+4 -12
View File
@@ -27,6 +27,9 @@
update_icon()
/obj/machinery/vr_sleeper/attack_hand(mob/user)
. = ..()
if(.)
return
if(occupant)
ui_interact(user)
else
@@ -35,15 +38,12 @@
else
open_machine()
/obj/machinery/vr_sleeper/relaymove(mob/user)
open_machine()
/obj/machinery/vr_sleeper/container_resist(mob/living/user)
open_machine()
/obj/machinery/vr_sleeper/Destroy()
open_machine()
cleanup_vr_human()
@@ -57,11 +57,9 @@
you_die_in_the_game_you_die_for_real = TRUE
sparks.start()
/obj/machinery/vr_sleeper/update_icon()
icon_state = "[initial(icon_state)][state_open ? "-open" : ""]"
/obj/machinery/vr_sleeper/open_machine()
if(!state_open)
if(vr_human)
@@ -70,20 +68,17 @@
SStgui.close_user_uis(occupant, src)
..()
/obj/machinery/vr_sleeper/close_machine()
..()
if(occupant)
ui_interact(occupant)
/obj/machinery/vr_sleeper/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "vr_sleeper", "VR Sleeper", 475, 340, master_ui, state)
ui.open()
/obj/machinery/vr_sleeper/ui_act(action, params)
if(..())
return
@@ -124,7 +119,6 @@
open_machine()
. = TRUE
/obj/machinery/vr_sleeper/ui_data(mob/user)
var/list/data = list()
if(vr_human && !QDELETED(vr_human))
@@ -142,7 +136,6 @@
data["isoccupant"] = (user == occupant)
return data
/obj/machinery/vr_sleeper/proc/get_vr_spawnpoint() //proc so it can be overriden for team games or something
return safepick(available_vr_spawnpoints[vr_category])
@@ -179,8 +172,7 @@
/obj/machinery/vr_sleeper/proc/cleanup_vr_human()
if(vr_human)
vr_human.death(0)
vr_human.death(FALSE)
/obj/effect/landmark/vr_spawn //places you can spawn in VR, auto selected by the vr_sleeper during get_vr_spawnpoint()
var/vr_category = "default" //So we can have specific sleepers, eg: "Basketball VR Sleeper", etc.
+4 -16
View File
@@ -97,7 +97,8 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list(
/client/proc/mass_zombie_cure,
/client/proc/polymorph_all,
/client/proc/show_tip,
/client/proc/smite
/client/proc/smite,
/client/proc/admin_away
))
GLOBAL_PROTECT(admin_verbs_spawn)
GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom, /datum/admins/proc/spawn_cargo, /datum/admins/proc/spawn_objasmob, /client/proc/respawn_character))
@@ -284,21 +285,8 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
/client/proc/play_web_sound,
GLOB.admin_verbs_spawn,
/*Debug verbs added by "show debug verbs"*/
/client/proc/Cell,
/client/proc/camera_view,
/client/proc/sec_camera_report,
/client/proc/intercom_view,
/client/proc/air_status,
/client/proc/atmosscan,
/client/proc/powerdebug,
/client/proc/count_objects_on_z_level,
/client/proc/count_objects_all,
/client/proc/cmd_assume_direct_control,
/client/proc/startSinglo,
/client/proc/set_server_fps,
/client/proc/cmd_admin_grantfullaccess,
/client/proc/cmd_admin_areatest_all,
/client/proc/cmd_admin_areatest_station,
GLOB.admin_verbs_debug_mapping,
/client/proc/disable_debug_verbs,
/client/proc/readmin
)
+1
View File
@@ -31,6 +31,7 @@
playsound(get_turf(src), 'sound/items/party_horn.ogg', 50, 1, -1)
qdel(src)
//ATTACK GHOST IGNORING PARENT RETURN VALUE
/obj/effect/fun_balloon/attack_ghost(mob/user)
if(!user.client || !user.client.holder || popped)
return
+2 -2
View File
@@ -173,7 +173,7 @@
if("night_shift_set")
if(!check_rights(R_ADMIN))
return
var/val = alert(usr, "What do you want to set night shift to? This will override the automatic system until set to automatic again.", "On", "Off", "Automatic")
var/val = alert(usr, "What do you want to set night shift to? This will override the automatic system until set to automatic again.", "Night Shift", "On", "Off", "Automatic")
switch(val)
if("Automatic")
if(CONFIG_GET(flag/enable_night_shifts))
@@ -488,7 +488,7 @@
message_admins("[key_name_admin(usr)] activated AK-47s for Everyone!")
usr.client.ak47s()
sound_to_playing_players('sound/misc/ak47s.ogg')
if("guns")
if(!check_rights(R_FUN))
return
+1
View File
@@ -44,6 +44,7 @@
if(user.client.holder)
to_chat(user, "<b>Alt-click it to quickly activate it!</b>")
//ATTACK GHOST IGNORING PARENT RETURN VALUE
/obj/effect/sound_emitter/attack_ghost(mob/user)
if(!check_rights_for(user.client, R_SOUNDS))
examine(user)
+8 -4
View File
@@ -1094,14 +1094,18 @@
else if(href_list["deletemessage"])
if(!check_rights(R_ADMIN))
return
var/message_id = href_list["deletemessage"]
delete_message(message_id)
var/safety = alert("Delete message/note?",,"Yes","No");
if (safety == "Yes")
var/message_id = href_list["deletemessage"]
delete_message(message_id)
else if(href_list["deletemessageempty"])
if(!check_rights(R_ADMIN))
return
var/message_id = href_list["deletemessageempty"]
delete_message(message_id, browse = 1)
var/safety = alert("Delete message/note?",,"Yes","No");
if (safety == "Yes")
var/message_id = href_list["deletemessageempty"]
delete_message(message_id, browse = TRUE)
else if(href_list["editmessage"])
if(!check_rights(R_ADMIN))
+2 -2
View File
@@ -56,7 +56,7 @@
if(holder)
to_chat(src, "<font color='red'>Error: Admin-PM: Client not found.</font>")
return
var/datum/admin_help/AH = C.current_ticket
if(AH)
@@ -90,7 +90,7 @@
recipient = GLOB.directory[whom]
else if(istype(whom, /client))
recipient = whom
if(irc)
if(!ircreplyamount) //to prevent people from spamming irc
+36
View File
@@ -503,6 +503,42 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
qdel(adminmob)
SSblackbox.record_feedback("tally", "admin_verb", 1, "Assume Direct Control") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_test_atmos_controllers()
set category = "Mapping"
set name = "Test Atmos Monitoring Consoles"
var/list/dat = list()
if(SSticker.current_state == GAME_STATE_STARTUP)
to_chat(usr, "Game still loading, please hold!")
return
message_admins("<span class='adminnotice'>[key_name_admin(usr)] used the Test Atmos Monitor debug command.</span>")
log_admin("[key_name(usr)] used the Test Atmos Monitor debug command.")
var/bad_shit = 0
for(var/obj/machinery/computer/atmos_control/tank/console in GLOB.atmos_air_controllers)
dat += "<h1>[console] at [get_area_name(console, TRUE)] [COORD(console)]:</h1><br>"
if(console.input_tag == console.output_tag)
dat += "Error: input_tag is the same as the output_tag, \"[console.input_tag]\"!<br>"
bad_shit++
if(!LAZYLEN(console.input_info))
dat += "Failed to find a valid outlet injector as an input with the tag [console.input_tag].<br>"
bad_shit++
if(!LAZYLEN(console.output_info))
dat += "Failed to find a valid siphon pump as an outlet with the tag [console.output_tag].<br>"
bad_shit++
if(!bad_shit)
dat += "<B>STATUS:</B> NORMAL"
else
bad_shit = 0
dat += "<br>"
CHECK_TICK
var/datum/browser/popup = new(usr, "testatmoscontroller", "Test Atmos Monitoring Consoles", 500, 750)
popup.set_content(dat.Join())
popup.open()
/client/proc/cmd_admin_areatest(on_station)
set category = "Mapping"
set name = "Test Areas"
+1
View File
@@ -36,6 +36,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list(
/client/proc/cmd_admin_grantfullaccess,
/client/proc/cmd_admin_areatest_all,
/client/proc/cmd_admin_areatest_station,
/client/proc/cmd_admin_test_atmos_controllers,
/client/proc/cmd_admin_rejuvenate,
/datum/admins/proc/show_traitor_panel,
/client/proc/disable_communication,
+5 -4
View File
@@ -1036,10 +1036,11 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
for(var/datum/atom_hud/antag/H in GLOB.huds) // add antag huds
(adding_hud) ? H.add_hud_to(usr) : H.remove_hud_from(usr)
if (adding_hud)
mob.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE
else
mob.lighting_alpha = initial(mob.lighting_alpha)
if(prefs.toggles & COMBOHUD_LIGHTING)
if(adding_hud)
mob.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE
else
mob.lighting_alpha = initial(mob.lighting_alpha)
mob.update_sight()
@@ -501,7 +501,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
L.lastattackerckey = user.ckey
L.Knockdown(140)
L.apply_effect(STUTTER, 7)
L.apply_effect(EFFECT_STUTTER, 7)
L.visible_message("<span class='danger'>[user] has stunned [L] with [src]!</span>", \
"<span class='userdanger'>[user] has stunned you with [src]!</span>")
@@ -105,7 +105,7 @@
/obj/item/organ/heart/gland/heals/activate()
to_chat(owner, "<span class='notice'>You feel curiously revitalized.</span>")
owner.adjustToxLoss(-20, FALSE, TRUE)
owner.heal_bodypart_damage(20, 20, TRUE)
owner.heal_bodypart_damage(20, 20, 0, TRUE)
owner.adjustOxyLoss(-20)
/obj/item/organ/heart/gland/slime
@@ -58,11 +58,6 @@
var/datum/species/abductor/S = H.dna.species
return S.scientist
/obj/machinery/computer/camera_advanced/abductor/attack_hand(mob/user)
if(!isabductor(user))
return
return ..()
/datum/action/innate/teleport_in
name = "Send To"
icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
@@ -26,7 +26,8 @@
var/list/datum/icon_snapshot/disguises = list()
/obj/machinery/abductor/console/attack_hand(mob/user)
if(..())
. = ..()
if(.)
return
if(!isabductor(user))
to_chat(user, "<span class='warning'>You start mashing alien buttons at random!</span>")
@@ -24,7 +24,8 @@
amounts[i] = rand(1,5)
/obj/machinery/abductor/gland_dispenser/attack_hand(mob/user)
if(..())
. = ..()
if(.)
return
if(!isabductor(user))
return
@@ -23,7 +23,8 @@
close_machine(target)
/obj/machinery/abductor/experiment/attack_hand(mob/user)
if(..())
. = ..()
if(.)
return
experimentUI(user)
@@ -33,4 +33,4 @@
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
changeling.purchasedpowers -= src
return 0
. = ..()
. = ..()
@@ -10,79 +10,86 @@
name = "flesh"
flags_1 = NODROP_1
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/glasses/changeling/attack_hand(mob/user)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
qdel(src)
return
..()
. = ..()
/obj/item/clothing/under/changeling
name = "flesh"
flags_1 = NODROP_1
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/under/changeling/attack_hand(mob/user)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
qdel(src)
return
..()
. = ..()
/obj/item/clothing/suit/changeling
name = "flesh"
flags_1 = NODROP_1
allowed = list(/obj/item/changeling)
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/suit/changeling/attack_hand(mob/user)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
qdel(src)
return
..()
. = ..()
/obj/item/clothing/head/changeling
name = "flesh"
flags_1 = NODROP_1
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/head/changeling/attack_hand(mob/user)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
qdel(src)
return
..()
. = ..()
/obj/item/clothing/shoes/changeling
name = "flesh"
flags_1 = NODROP_1
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/shoes/changeling/attack_hand(mob/user)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
qdel(src)
return
..()
. = ..()
/obj/item/clothing/gloves/changeling
name = "flesh"
flags_1 = NODROP_1
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/gloves/changeling/attack_hand(mob/user)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
qdel(src)
return
..()
. = ..()
/obj/item/clothing/mask/changeling
name = "flesh"
flags_1 = NODROP_1
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/mask/changeling/attack_hand(mob/user)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
qdel(src)
return
..()
. = ..()
/obj/item/changeling
name = "flesh"
@@ -90,12 +97,13 @@
slot_flags = ALL
allowed = list(/obj/item/changeling)
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/changeling/attack_hand(mob/user)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
qdel(src)
return
..()
. = ..()
//Change our DNA to that of somebody we've absorbed.
/obj/effect/proc_holder/changeling/transform/sting_action(mob/living/carbon/human/user)
@@ -36,6 +36,7 @@
return
. = ..()
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/effect/clockwork/city_of_cogs_rift/attack_hand(atom/movable/AM)
beckon(AM)
@@ -26,14 +26,15 @@
/obj/effect/clockwork/sigil/attack_tk(mob/user)
return //you can't tk stomp sigils, but you can hit them with something
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/effect/clockwork/sigil/attack_hand(mob/user)
if(iscarbon(user) && !user.stat)
if(is_servant_of_ratvar(user) && user.a_intent != INTENT_HARM)
return ..()
user.visible_message("<span class='warning'>[user] stamps out [src]!</span>", "<span class='danger'>You stomp on [src], scattering it into thousands of particles.</span>")
qdel(src)
return 1
..()
return TRUE
. = ..()
/obj/effect/clockwork/sigil/ex_act(severity)
visible_message("<span class='warning'>[src] scatters into thousands of particles.</span>")
@@ -57,11 +57,13 @@
if(is_servant_of_ratvar(user) || isobserver(user))
to_chat(user, "<span class='brass'>It has [uses] use\s remaining.</span>")
//ATTACK GHOST IGNORING PARENT RETURN VALUE
/obj/effect/clockwork/spatial_gateway/attack_ghost(mob/user)
if(linked_gateway)
user.forceMove(get_turf(linked_gateway))
..()
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/effect/clockwork/spatial_gateway/attack_hand(mob/living/user)
if(!uses)
return FALSE
@@ -36,10 +36,11 @@
speed_multiplier = 0
no_cost = TRUE
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clockwork/slab/debug/attack_hand(mob/living/user)
..()
if(!is_servant_of_ratvar(user))
add_servant_of_ratvar(user)
return ..()
/obj/item/clockwork/slab/cyborg //three scriptures, plus a spear and fabricator
clockwork_desc = "A divine link to the Celestial Derelict, allowing for limited recital of scripture."
@@ -30,12 +30,14 @@
..()
clockwork_desc = initial(clockwork_desc)
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clockwork/construct_chassis/attack_hand(mob/living/user)
if(w_class >= WEIGHT_CLASS_HUGE)
to_chat(user, "<span class='warning'>[src] is too cumbersome to carry! Drag it around instead!</span>")
return
. = ..()
//ATTACK GHOST IGNORING PARENT RETURN VALUE
/obj/item/clockwork/construct_chassis/attack_ghost(mob/user)
if(!SSticker.mode)
to_chat(user, "<span class='danger'>You cannot use that before the game has started.</span>")
@@ -66,11 +66,10 @@
new/obj/item/stack/tile/brass(user.loc, 5)
to_chat(user, "<span class='brass'>You use [get_clockwork_power() ? "some":"all"] of [src]'s power to produce <b>5</b> brass sheets. It now has access to <b>[DisplayPower(get_clockwork_power())]</b> of power.</span>")
/obj/item/clockwork/replica_fabricator/pre_attackby(atom/target, mob/living/user, params)
/obj/item/clockwork/replica_fabricator/pre_attack(atom/target, mob/living/user, params)
if(!target || !user || !is_servant_of_ratvar(user) || istype(target, /obj/item/storage))
return TRUE
return fabricate(target, user)
return TRUE
//A note here; return values are for if we CAN BE PUT ON A TABLE, not IF WE ARE SUCCESSFUL, unless no_table_check is TRUE
/obj/item/clockwork/replica_fabricator/proc/fabricate(atom/target, mob/living/user, silent, no_table_check)
@@ -85,7 +85,7 @@
/obj/structure/destructible/clockwork/attack_ai(mob/user)
if(is_servant_of_ratvar(user))
attack_hand(user)
return attack_hand(user)
/obj/structure/destructible/clockwork/attack_animal(mob/living/simple_animal/M)
if(is_servant_of_ratvar(M))
@@ -351,6 +351,7 @@
T.ratvar_act(dist)
CHECK_TICK
//ATTACK GHOST IGNORING PARENT RETURN VALUE
/obj/structure/destructible/clockwork/massive/celestial_gateway/attack_ghost(mob/user)
if(!IsAdminGhost(user))
return ..()
@@ -42,6 +42,9 @@
return affected
/obj/structure/destructible/clockwork/powered/clockwork_obelisk/attack_hand(mob/living/user)
. = ..()
if(.)
return
if(!is_servant_of_ratvar(user) || !can_access_clockwork_power(src, hierophant_cost) || !anchored)
to_chat(user, "<span class='warning'>You place your hand on [src], but it doesn't react.</span>")
return
@@ -12,6 +12,9 @@
var/kingmaking
/obj/structure/destructible/clockwork/eminence_spire/attack_hand(mob/living/user)
. = ..()
if(.)
return
if(!is_servant_of_ratvar(user))
to_chat(user, "<span class='notice'>You can tell how powerful [src] is; you know better than to touch it.</span>")
return
@@ -42,6 +45,7 @@
to_chat(user, "<span class='warning'>You feel the omniscient gaze turn into a puzzled frown. Perhaps you should just stick to building.</span>")
return
//ATTACK GHOST IGNORING PARENT RETURN VALUE
/obj/structure/destructible/clockwork/eminence_spire/attack_ghost(mob/user)
if(!IsAdminGhost(user))
return
@@ -59,6 +59,9 @@
to_chat(user, "<span class='big brass'>There are <b>[voters.len]/[votes_needed]</b> votes to activate the beacon!</span>")
/obj/structure/destructible/clockwork/heralds_beacon/attack_hand(mob/living/user)
. = ..()
if(.)
return
if(!is_servant_of_ratvar(user))
to_chat(user, "<span class='notice'>You can tell how powerful [src] is; you know better than to touch it.</span>")
return
@@ -31,6 +31,9 @@
return TRUE
/obj/structure/destructible/clockwork/powered/mania_motor/attack_hand(mob/living/user)
. = ..()
if(.)
return
if(user.canUseTopic(src, !issilicon(user), NO_DEXTERY) && is_servant_of_ratvar(user))
if(!can_access_clockwork_power(src, mania_cost))
to_chat(user, "<span class='warning'>[src] needs more power to function!</span>")
@@ -38,6 +38,7 @@
STOP_PROCESSING(SSobj, src)
return ..()
//ATTACK GHOST IGNORING PARENT RETURN VALUE
/obj/structure/destructible/clockwork/massive/ratvar/attack_ghost(mob/dead/observer/O)
var/alertresult = alert(O, "Embrace the Justiciar's light? You can no longer be cloned!",,"Yes", "No")
if(alertresult == "No" || QDELETED(O) || !istype(O) || !O.key)
@@ -7,6 +7,9 @@
icon_state = "lever"
/obj/structure/destructible/clockwork/trap/trigger/lever/attack_hand(mob/living/user)
. = ..()
if(.)
return
user.visible_message("<span class='notice'>[user] pulls [src]!</span>", "<span class='notice'>You pull [src]. It clicks, then lifts back upwards.</span>")
if(wired_to.len)
audible_message("<i>You hear gears clanking.</i>")
@@ -7,6 +7,9 @@
icon_state = "repeater"
/obj/structure/destructible/clockwork/trap/trigger/repeater/attack_hand(mob/living/user)
. = ..()
if(.)
return
if(!is_servant_of_ratvar(user))
return
if(!isprocessing)
@@ -81,6 +81,9 @@
break_message = "<span class='warning'>The altar shatters, leaving only the wailing of the damned!</span>"
/obj/structure/destructible/cult/talisman/attack_hand(mob/living/user)
. = ..()
if(.)
return
if(!iscultist(user))
to_chat(user, "<span class='warning'>You're pretty sure you know exactly what this is used for and you can't seem to touch it.</span>")
return
@@ -114,6 +117,9 @@
break_message = "<span class='warning'>The force breaks apart into shards with a howling scream!</span>"
/obj/structure/destructible/cult/forge/attack_hand(mob/living/user)
. = ..()
if(.)
return
if(!iscultist(user))
to_chat(user, "<span class='warning'>The heat radiating from [src] pushes you back.</span>")
return
@@ -234,6 +240,9 @@
break_message = "<span class='warning'>The books and tomes of the archives burn into ash as the desk shatters!</span>"
/obj/structure/destructible/cult/tome/attack_hand(mob/living/user)
. = ..()
if(.)
return
if(!iscultist(user))
to_chat(user, "<span class='warning'>These books won't open and it hurts to even try and read the covers.</span>")
return
+3
View File
@@ -67,6 +67,9 @@ Runes can either be invoked by one's self or with many different cultists. Each
qdel(src)
/obj/effect/rune/attack_hand(mob/living/user)
. = ..()
if(.)
return
if(!iscultist(user))
to_chat(user, "<span class='warning'>You aren't able to understand the words of [src].</span>")
return
@@ -141,6 +141,7 @@
return 0
return ..()
//ATTACK GHOST IGNORING PARENT RETURN VALUE
/mob/living/carbon/true_devil/attack_ghost(mob/dead/observer/user as mob)
if(ascended || user.mind.soulOwner == src.mind)
var/mob/living/simple_animal/imp/S = new(get_turf(loc))
@@ -162,7 +163,8 @@
//They're immune to fire.
/mob/living/carbon/true_devil/attack_hand(mob/living/carbon/human/M)
if(..())
. = ..()
if(.)
switch(M.a_intent)
if ("harm")
var/damage = rand(1, 5)
+2 -2
View File
@@ -26,7 +26,7 @@
melee_damage_upper = 20
see_in_dark = 8
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
idle_vision_range = 1 // Only attack when target is close
vision_range = 1 // Only attack when target is close
wander = 0
attacktext = "glomps"
attack_sound = 'sound/effects/blobattack.ogg'
@@ -167,7 +167,7 @@
restore()
/mob/living/simple_animal/hostile/morph/LoseAggro()
vision_range = idle_vision_range
vision_range = initial(vision_range)
/mob/living/simple_animal/hostile/morph/AIShouldSleep(var/list/possible_targets)
. = ..()
@@ -232,9 +232,6 @@
var/volume = (get_time_left() <= 20 ? 30 : 5)
playsound(loc, 'sound/items/timer.ogg', volume, 0)
/obj/machinery/nuclearbomb/attack_paw(mob/user)
return attack_hand(user)
/obj/machinery/nuclearbomb/ui_interact(mob/user, ui_key="main", datum/tgui/ui=null, force_open=0, datum/tgui/master_ui=null, datum/ui_state/state=GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
@@ -348,7 +348,20 @@
return result.Join()
/datum/team/revolution/antag_listing_entry()
var/common_part = ..()
var/common_part = ""
var/list/parts = list()
parts += "<b>[antag_listing_name()]</b><br>"
parts += "<table cellspacing=5>"
var/list/heads = get_team_antags(/datum/antagonist/rev/head,TRUE)
for(var/datum/antagonist/A in heads | get_team_antags())
parts += A.antag_listing_entry()
parts += "</table>"
parts += antag_listing_footer()
common_part = parts.Join()
var/heads_report = "<b>Heads of Staff</b><br>"
heads_report += "<table cellspacing=5>"
for(var/datum/mind/N in SSjob.get_living_heads())
@@ -35,6 +35,9 @@
notify_ghosts("A swarmer shell has been created in [A.name].", 'sound/effects/bin_close.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE)
/obj/effect/mob_spawn/swarmer/attack_hand(mob/living/user)
. = ..()
if(.)
return
to_chat(user, "<span class='notice'>Picking up the swarmer may cause it to activate. You should be careful about this.</span>")
/obj/effect/mob_spawn/swarmer/attackby(obj/item/W, mob/user, params)
File diff suppressed because it is too large Load Diff
+1 -2
View File
@@ -116,5 +116,4 @@
return TRUE
/obj/item/device/assembly/interact(mob/user)
return //HTML MENU FOR WIRES GOES HERE
return ui_interact(user)
+2 -3
View File
@@ -73,7 +73,8 @@
STOP_PROCESSING(SSobj, src)
return
/obj/item/device/assembly/health/interact(mob/user as mob)//TODO: Change this to the wires thingy
/obj/item/device/assembly/health/ui_interact(mob/user as mob)//TODO: Change this to the wires thingy
. = ..()
if(!secured)
user.show_message("<span class='warning'>The [name] is unsecured!</span>")
return 0
@@ -82,8 +83,6 @@
dat += "<BR>Health: [health_scan]"
user << browse(dat, "window=hscan")
onclose(user, "hscan")
return
/obj/item/device/assembly/health/Topic(href, href_list)
..()
+3 -2
View File
@@ -74,11 +74,12 @@
a_right.holder_movement()
/obj/item/device/assembly_holder/attack_hand()//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess
. = ..()
if(.)
return
if(a_left && a_right)
a_left.holder_movement()
a_right.holder_movement()
..()
return
/obj/item/device/assembly_holder/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/screwdriver))
+2 -1
View File
@@ -127,7 +127,8 @@
return
return refreshBeam()
/obj/item/device/assembly/infra/interact(mob/user)//TODO: change this this to the wire control panel
/obj/item/device/assembly/infra/ui_interact(mob/user)//TODO: change this this to the wire control panel
. = ..()
if(is_secured(user))
user.set_machine(src)
var/dat = "<TT><B>Infrared Laser</B>\n<B>Status</B>: [on ? "<A href='?src=[REF(src)];state=0'>On</A>" : "<A href='?src=[REF(src)];state=1'>Off</A>"]<BR>\n<B>Visibility</B>: [visible ? "<A href='?src=[REF(src)];visible=0'>Visible</A>" : "<A href='?src=[REF(src)];visible=1'>Invisible</A>"]<BR>\n</TT>"
+3 -2
View File
@@ -90,6 +90,7 @@
playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/device/assembly/mousetrap/attack_hand(mob/living/carbon/human/user)
if(armed)
if((user.has_trait(TRAIT_DUMB) || user.has_trait(TRAIT_CLUMSY)) && prob(50))
@@ -100,7 +101,7 @@
user.visible_message("<span class='warning'>[user] accidentally sets off [src], breaking their fingers.</span>", \
"<span class='warning'>You accidentally trigger [src]!</span>")
return
..()
return ..()
/obj/item/device/assembly/mousetrap/Crossed(atom/movable/AM as mob|obj)
@@ -139,4 +140,4 @@
/obj/item/device/assembly/mousetrap/armed
icon_state = "mousetraparmed"
armed = 1
armed = 1
+2 -1
View File
@@ -93,7 +93,8 @@
holder.update_icon()
return
/obj/item/device/assembly/prox_sensor/interact(mob/user)//TODO: Change this to the wires thingy
/obj/item/device/assembly/prox_sensor/ui_interact(mob/user)//TODO: Change this to the wires thingy
. = ..()
if(is_secured(user))
var/second = time % 60
var/minute = (time - second) / 60
+2 -1
View File
@@ -48,7 +48,8 @@
holder.update_icon()
return
/obj/item/device/assembly/signaler/interact(mob/user, flag1)
/obj/item/device/assembly/signaler/ui_interact(mob/user, flag1)
. = ..()
if(is_secured(user))
var/t1 = "-------"
var/dat = {"
+2 -1
View File
@@ -79,7 +79,8 @@
holder.update_icon()
/obj/item/device/assembly/timer/interact(mob/user)//TODO: Have this use the wires
/obj/item/device/assembly/timer/ui_interact(mob/user)//TODO: Have this use the wires
. = ..()
if(is_secured(user))
var/second = time % 60
var/minute = (time - second) / 60
@@ -18,6 +18,8 @@ It's like a regular ol' straight pipe, but you can turn it on and off.
construction_type = /obj/item/pipe/binary
pipe_state = "mvalve"
var/switching = FALSE
/obj/machinery/atmospherics/components/binary/valve/open
open = TRUE
@@ -50,17 +52,24 @@ It's like a regular ol' straight pipe, but you can turn it on and off.
return
/obj/machinery/atmospherics/components/binary/valve/attack_hand(mob/user)
. = ..()
if(.)
return
add_fingerprint(usr)
update_icon_nopipes(1)
if(switching)
return
switching = TRUE
sleep(10)
if(open)
close()
return
open()
else
open()
var/turf/T = get_turf(src)
var/area/A = get_area(src)
investigate_log("Valve, [src.name], was manipiulated by [key_name(usr)] at [x], [y], [z], [A]", "atmos")
message_admins("Valve, [src.name], was manipulated by [ADMIN_LOOKUPFLW(user)] at [ADMIN_COORDJMP(T)], [A]")
switching = FALSE
/obj/machinery/atmospherics/components/binary/valve/digital // can be controlled by AI
name = "digital valve"
@@ -70,7 +79,7 @@ It's like a regular ol' straight pipe, but you can turn it on and off.
pipe_state = "dvalve"
/obj/machinery/atmospherics/components/binary/valve/digital/attack_ai(mob/user)
return src.attack_hand(user)
return attack_hand(user)
/obj/machinery/atmospherics/components/binary/valve/digital/update_icon_nopipes(animation)
if(!is_operational())
@@ -35,6 +35,46 @@
SSradio.remove_object(src,frequency)
return ..()
/obj/machinery/atmospherics/components/trinary/filter/atmos //Used for atmos waste loops
on = TRUE
icon_state = "filter_on"
/obj/machinery/atmospherics/components/trinary/filter/atmos/n2
name = "nitrogen filter"
filter_type = "n2"
/obj/machinery/atmospherics/components/trinary/filter/atmos/o2
name = "oxygen filter"
filter_type = "o2"
/obj/machinery/atmospherics/components/trinary/filter/atmos/co2
name = "carbon dioxide filter"
filter_type = "co2"
/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o
name = "nitrous oxide filter"
filter_type = "n2o"
/obj/machinery/atmospherics/components/trinary/filter/atmos/plasma
name = "plasma filter"
filter_type = "plasma"
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped //This feels wrong, I know
icon_state = "filter_on_f"
flipped = TRUE
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2
name = "nitrogen filter"
filter_type = "n2"
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/o2
name = "oxygen filter"
filter_type = "o2"
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2
name = "carbon dioxide filter"
filter_type = "co2"
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2o
name = "nitrous oxide filter"
filter_type = "n2o"
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/plasma
name = "plasma filter"
filter_type = "plasma"
/obj/machinery/atmospherics/components/trinary/filter/update_icon()
cut_overlays()
for(var/direction in GLOB.cardinals)
@@ -21,6 +21,26 @@
icon_state = "mixer_off_f"
flipped = TRUE
/obj/machinery/atmospherics/components/trinary/mixer/airmix //For standard airmix to distro
name = "air mixer"
icon_state = "mixer_on"
node1_concentration = N2STANDARD
node2_concentration = O2STANDARD
on = TRUE
target_pressure = MAX_OUTPUT_PRESSURE
/obj/machinery/atmospherics/components/trinary/mixer/airmix/inverse
node1_concentration = O2STANDARD
node2_concentration = N2STANDARD
/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped
icon_state = "mixer_on_f"
flipped = TRUE
/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped/inverse
node1_concentration = O2STANDARD
node2_concentration = N2STANDARD
/obj/machinery/atmospherics/components/trinary/mixer/update_icon()
cut_overlays()
for(var/direction in GLOB.cardinals)
@@ -24,6 +24,45 @@
SSradio.remove_object(src,frequency)
return ..()
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos
frequency = FREQ_ATMOS_STORAGE
on = TRUE
volume_rate = 200
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/atmos_waste
name = "atmos waste outlet injector"
id = ATMOS_GAS_MONITOR_WASTE_ATMOS
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/engine_waste
name = "engine outlet injector"
id = ATMOS_GAS_MONITOR_WASTE_ENGINE
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxin_input
name = "plasma tank input injector"
id = ATMOS_GAS_MONITOR_INPUT_TOX
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/oxygen_input
name = "oxygen tank input injector"
id = ATMOS_GAS_MONITOR_INPUT_O2
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/nitrogen_input
name = "nitrogen tank input injector"
id = ATMOS_GAS_MONITOR_INPUT_N2
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/mix_input
name = "mix tank input injector"
id = ATMOS_GAS_MONITOR_INPUT_MIX
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/nitrous_input
name = "nitrous oxide tank input injector"
id = ATMOS_GAS_MONITOR_INPUT_N2O
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/air_input
name = "air mix tank input injector"
id = ATMOS_GAS_MONITOR_INPUT_AIR
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/carbon_input
name = "carbon dioxide tank input injector"
id = ATMOS_GAS_MONITOR_INPUT_CO2
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/incinerator_input
name = "incinerator chamber input injector"
id = ATMOS_GAS_MONITOR_INPUT_INCINERATOR
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxins_mixing_input
name = "toxins mixing input injector"
id = ATMOS_GAS_MONITOR_INPUT_TOXINS_LAB
/obj/machinery/atmospherics/components/unary/outlet_injector/on
on = TRUE
@@ -164,28 +164,41 @@
icon_state_on = "freezer_1"
icon_state_open = "freezer-o"
max_temperature = T20C
min_temperature = 170
min_temperature = 170 //actual minimum temperature is defined by RefreshParts()
circuit = /obj/item/circuitboard/machine/thermomachine/freezer
/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on
on = TRUE
icon_state = "freezer_1"
/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/Initialize()
. = ..()
if(target_temperature == initial(target_temperature))
target_temperature = min_temperature
/obj/machinery/atmospherics/components/unary/thermomachine/freezer/RefreshParts()
..()
var/L
for(var/obj/item/stock_parts/micro_laser/M in component_parts)
L += M.rating
min_temperature = max(T0C - (initial(min_temperature) + L * 15), TCMB)
min_temperature = max(T0C - (initial(min_temperature) + L * 15), TCMB) //73.15K with T1 stock parts
/obj/machinery/atmospherics/components/unary/thermomachine/heater
name = "heater"
icon_state = "heater"
icon_state_on = "heater_1"
icon_state_open = "heater-o"
max_temperature = 140
max_temperature = 140 //actual maximum temperature is defined by RefreshParts()
min_temperature = T20C
circuit = /obj/item/circuitboard/machine/thermomachine/heater
/obj/machinery/atmospherics/components/unary/thermomachine/heater/on
on = TRUE
icon_state = "heater_1"
/obj/machinery/atmospherics/components/unary/thermomachine/heater/RefreshParts()
..()
var/L
for(var/obj/item/stock_parts/micro_laser/M in component_parts)
L += M.rating
max_temperature = T20C + (initial(max_temperature) * L)
max_temperature = T20C + (initial(max_temperature) * L) //573.15K with T1 stock parts
@@ -47,6 +47,38 @@
on = TRUE
icon_state = "vent_map_siphon_on"
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos
frequency = FREQ_ATMOS_STORAGE
on = TRUE
icon_state = "vent_map_siphon_on"
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/toxin_output
name = "plasma tank output inlet"
id_tag = ATMOS_GAS_MONITOR_OUTPUT_TOX
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/oxygen_output
name = "oxygen tank output inlet"
id_tag = ATMOS_GAS_MONITOR_OUTPUT_O2
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/nitrogen_output
name = "nitrogen tank output inlet"
id_tag = ATMOS_GAS_MONITOR_OUTPUT_N2
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/mix_output
name = "mix tank output inlet"
id_tag = ATMOS_GAS_MONITOR_OUTPUT_MIX
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/nitrous_output
name = "nitrous oxide tank output inlet"
id_tag = ATMOS_GAS_MONITOR_OUTPUT_N2O
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/carbon_output
name = "carbon dioxide tank output inlet"
id_tag = ATMOS_GAS_MONITOR_OUTPUT_CO2
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/incinerator_output
name = "incinerator chamber output inlet"
id_tag = ATMOS_GAS_MONITOR_OUTPUT_INCINERATOR
frequency = FREQ_ATMOS_CONTROL
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/toxins_mixing_output
name = "toxins mixing output inlet"
id_tag = ATMOS_GAS_MONITOR_OUTPUT_TOXINS_LAB
frequency = FREQ_ATMOS_CONTROL
/obj/machinery/atmospherics/components/unary/vent_pump/New()
..()
if(!id_tag)
@@ -79,6 +111,15 @@
on = TRUE
icon_state = "vent_map_siphon_on"
/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/atmos
frequency = FREQ_ATMOS_STORAGE
on = TRUE
icon_state = "vent_map_siphon_on"
/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/atmos/air_output
name = "air mix tank output inlet"
id_tag = ATMOS_GAS_MONITOR_OUTPUT_AIR
/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/New()
..()
var/datum/gas_mixture/air_contents = airs[1]
@@ -16,6 +16,17 @@
var/id_tag
var/target_layer = PIPING_LAYER_DEFAULT
/obj/machinery/meter/atmos
frequency = FREQ_ATMOS_STORAGE
/obj/machinery/meter/atmos/atmos_waste_loop
name = "waste loop gas flow meter"
id_tag = ATMOS_GAS_MONITOR_LOOP_ATMOS_WASTE
/obj/machinery/meter/atmos/distro_loop
name = "distribution loop gas flow meter"
id_tag = ATMOS_GAS_MONITOR_LOOP_DISTRIBUTION
/obj/machinery/meter/Destroy()
SSair.atmos_machinery -= src
target = null
@@ -100,7 +111,6 @@
..()
to_chat(user, status())
/obj/machinery/meter/wrench_act(mob/user, obj/item/I)
to_chat(user, "<span class='notice'>You begin to unfasten \the [src]...</span>")
if (I.use_tool(src, user, 40, volume=50))
@@ -116,19 +126,11 @@
new /obj/item/pipe_meter(loc)
qdel(src)
/obj/machinery/meter/attack_ai(mob/user)
return attack_hand(user)
/obj/machinery/meter/attack_paw(mob/user)
return attack_hand(user)
/obj/machinery/meter/attack_hand(mob/user)
/obj/machinery/meter/interact(mob/user)
if(stat & (NOPOWER|BROKEN))
return 1
return
else
to_chat(usr, status())
return 1
to_chat(user, status())
/obj/machinery/meter/singularity_pull(S, current_size)
..()
@@ -25,8 +25,8 @@
/obj/structure/artilleryplaceholder/decorative
density = FALSE
/obj/machinery/artillerycontrol/attack_hand(mob/user)
user.set_machine(src)
/obj/machinery/artillerycontrol/ui_interact(mob/user)
. = ..()
var/dat = "<B>Bluespace Artillery Control:</B><BR>"
dat += "Locked on<BR>"
dat += "<B>Charge progress: [reload]/[reload_cooldown]:</B><BR>"
@@ -34,7 +34,6 @@
dat += "Deployment of weapon authorized by <br>Nanotrasen Naval Command<br><br>Remember, friendly fire is grounds for termination of your contract and life.<HR>"
user << browse(dat, "window=scroll")
onclose(user, "scroll")
return
/obj/machinery/artillerycontrol/Topic(href, href_list)
if(..())
@@ -49,6 +49,7 @@
to_chat(M, "<span class='userdanger'>\The [src] has been returned to base!</span>")
STOP_PROCESSING(SSobj, src)
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/twohanded/ctf/attack_hand(mob/living/user)
if(!is_ctf_target(user) && !anyonecanpickup)
to_chat(user, "Non players shouldn't be moving the flag!")
@@ -70,6 +71,7 @@
if(istype(mob_area, /area/ctf))
to_chat(M, "<span class='userdanger'>\The [src] has been taken!</span>")
STOP_PROCESSING(SSobj, src)
..()
/obj/item/twohanded/ctf/dropped(mob/user)
..()
@@ -204,6 +206,7 @@
ctf_gear = /datum/outfit/ctf/blue
instagib_gear = /datum/outfit/ctf/blue/instagib
//ATTACK GHOST IGNORING PARENT RETURN VALUE
/obj/machinery/capture_the_flag/attack_ghost(mob/user)
if(ctf_enabled == FALSE)
if(user.client && user.client.holder)
@@ -663,6 +666,9 @@
capture(user)
/obj/machinery/control_point/attack_hand(mob/user)
. = ..()
if(.)
return
capture(user)
/obj/machinery/control_point/proc/capture(mob/user)
+2
View File
@@ -27,6 +27,7 @@
var/show_flavour = TRUE
var/banType = "lavaland"
//ATTACK GHOST IGNORING PARENT RETURN VALUE
/obj/effect/mob_spawn/attack_ghost(mob/user)
if(!SSticker.HasRoundStarted() || !loc)
return
@@ -527,6 +528,7 @@
outfit = /datum/outfit/spacebartender
assignedrole = "Space Bar Patron"
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/effect/mob_spawn/human/alive/space_bar_patron/attack_hand(mob/user)
var/despawn = alert("Return to cryosleep? (Warning, Your mob will be deleted!)",,"Yes","No")
if(despawn == "No" || !loc || !Adjacent(user))
+3
View File
@@ -61,6 +61,9 @@ GLOBAL_DATUM(the_gateway, /obj/machinery/gateway/centerstation)
icon_state = "off"
/obj/machinery/gateway/attack_hand(mob/user)
. = ..()
if(.)
return
if(!detect())
return
if(!active)
@@ -28,12 +28,10 @@
..()
toggleFirepit()
/obj/structure/firepit/attack_hand(mob/living/user)
/obj/structure/firepit/interact(mob/living/user)
if(active)
active = 0
active = FALSE
toggleFirepit()
else
..()
/obj/structure/firepit/attackby(obj/item/W,mob/living/user,params)
if(!active)
@@ -48,6 +46,7 @@
W.fire_act()
/obj/structure/firepit/proc/toggleFirepit()
active = !active
if(active)
set_light(8)
icon_state = "firepit-active"
@@ -70,9 +70,7 @@
var/chargesa = 1
var/insistinga = 0
/obj/machinery/wish_granter_dark/attack_hand(mob/living/carbon/human/user)
usr.set_machine(src)
/obj/machinery/wish_granter_dark/interact(mob/living/carbon/human/user)
if(chargesa <= 0)
to_chat(user, "The Wish Granter lies silent.")
return
+3
View File
@@ -16,6 +16,9 @@
return attack_hand(user)
/obj/structure/signpost/attack_hand(mob/user)
. = ..()
if(.)
return
switch(alert(question,name,"Yes","No"))
if("Yes")
var/turf/T = find_safe_turf(zlevels=zlevels)
+44
View File
@@ -638,6 +638,50 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
return
create_message("note", ckey, system_ckey, message, null, null, 0, 0)
/client/Click(atom/object, atom/location, control, params)
var/ab = FALSE
var/list/L = params2list(params)
if (object && object == middragatom && L["left"])
ab = max(0, 5 SECONDS-(world.time-middragtime)*0.1)
var/mcl = CONFIG_GET(number/minute_click_limit)
if (!holder && mcl)
var/minute = round(world.time, 600)
if (!clicklimiter)
clicklimiter = new(LIMITER_SIZE)
if (minute != clicklimiter[CURRENT_MINUTE])
clicklimiter[CURRENT_MINUTE] = minute
clicklimiter[MINUTE_COUNT] = 0
clicklimiter[MINUTE_COUNT] += 1+(ab)
if (clicklimiter[MINUTE_COUNT] > mcl)
var/msg = "Your previous click was ignored because you've done too many in a minute."
if (minute != clicklimiter[ADMINSWARNED_AT]) //only one admin message per-minute. (if they spam the admins can just boot/ban them)
clicklimiter[ADMINSWARNED_AT] = minute
msg += " Administrators have been informed."
if (ab)
log_game("[key_name(src)] is using the middle click aimbot exploit")
message_admins("[key_name_admin(src)] [ADMIN_FLW(usr)] [ADMIN_KICK(usr)] is using the middle click aimbot exploit</span>")
add_system_note("aimbot", "Is using the middle click aimbot exploit")
log_game("[key_name(src)] Has hit the per-minute click limit of [mcl] clicks in a given game minute")
message_admins("[key_name_admin(src)] [ADMIN_FLW(usr)] [ADMIN_KICK(usr)] Has hit the per-minute click limit of [mcl] clicks in a given game minute")
to_chat(src, "<span class='danger'>[msg]</span>")
return
var/scl = CONFIG_GET(number/second_click_limit)
if (!holder && scl)
var/second = round(world.time, 10)
if (!clicklimiter)
clicklimiter = new(LIMITER_SIZE)
if (second != clicklimiter[CURRENT_SECOND])
clicklimiter[CURRENT_SECOND] = second
clicklimiter[SECOND_COUNT] = 0
clicklimiter[SECOND_COUNT] += 1+(!!ab)
if (clicklimiter[SECOND_COUNT] > scl)
to_chat(src, "<span class='danger'>Your previous click was ignored because you've done too many in a second</span>")
return
..()
/client/proc/check_ip_intel()
set waitfor = 0 //we sleep when getting the intel, no need to hold up the client connection while we sleep
+14 -3
View File
@@ -104,10 +104,21 @@
src.icon_state = "orange1"
return
/obj/item/clothing/shoes/sneakers/orange/attack_hand(mob/user)
/obj/item/clothing/shoes/sneakers/orange/allow_attack_hand_drop(mob/user)
if(ishuman(user))
var/mob/living/carbon/human/C = user
if(C.shoes == src && src.chained == 1)
if(C.shoes == src && chained == 1)
to_chat(user, "<span class='warning'>You need help taking these off!</span>")
return FALSE
return ..()
/obj/item/clothing/shoes/sneakers/orange/MouseDrop(atom/over)
var/mob/m = usr
if(ishuman(m))
var/mob/living/carbon/human/c = m
if(c.shoes == src && chained == 1)
to_chat(c, "<span class='warning'>You need help taking these off!</span>")
return
..()
return ..()
+14 -4
View File
@@ -34,7 +34,7 @@
subcategory = CAT_WEAPON
/datum/crafting_recipe/lance
name = "explosive lance (grenade)"
name = "Explosive Lance (Grenade)"
result = /obj/item/twohanded/spear
reqs = list(/obj/item/twohanded/spear = 1,
/obj/item/grenade = 1)
@@ -45,7 +45,7 @@
subcategory = CAT_WEAPON
/datum/crafting_recipe/strobeshield
name = "strobe shield"
name = "Strobe Shield"
result = /obj/item/device/assembly/flash/shield
reqs = list(/obj/item/wallframe/flasher = 1,
/obj/item/device/assembly/flash/handheld = 1,
@@ -441,7 +441,7 @@
subcategory = CAT_WEAPON
/datum/crafting_recipe/chemical_payload2
name = "Chemical Payload (gibtonite)"
name = "Chemical Payload (Gibtonite)"
result = /obj/item/bombcore/chemical
reqs = list(
/obj/item/stock_parts/matter_bin = 1,
@@ -510,7 +510,7 @@
category = CAT_PRIMAL
/datum/crafting_recipe/gold_horn
name = "Golden bike horn"
name = "Golden Bike Horn"
result = /obj/item/bikehorn/golden
time = 20
reqs = list(/obj/item/stack/sheet/mineral/bananium = 5,
@@ -606,3 +606,13 @@
name = "Mummification Bandages (Body)"
result = /obj/item/clothing/under/mummy
reqs = list(/obj/item/stack/sheet/cloth = 5)
/datum/crafting_recipe/guillotine
name = "Guillotine"
result = /obj/structure/guillotine
time = 150 // Building a functioning guillotine takes time
reqs = list(/obj/item/stack/sheet/plasteel = 3,
/obj/item/stack/sheet/mineral/wood = 20,
/obj/item/stack/cable_coil = 10)
tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER)
category = CAT_MISC
+35
View File
@@ -16,6 +16,15 @@
var/list/log = list()
var/range = 8
var/view_check = TRUE
actions_types = list(/datum/action/item_action/displayDetectiveScanResults)
/datum/action/item_action/displayDetectiveScanResults
name = "Display Forensic Scanner Results"
/datum/action/item_action/displayDetectiveScanResults/Trigger()
var/obj/item/device/detective_scanner/scanner = target
if(istype(scanner))
scanner.displayDetectiveScanResults(usr)
/obj/item/device/detective_scanner/attack_self(mob/user)
if(log.len && !scanning)
@@ -36,6 +45,7 @@
P.info += jointext(log, "<BR>")
P.info += "<HR><B>Notes:</B><BR>"
P.info_links = P.info
P.updateinfolinks()
if(ismob(loc))
var/mob/M = loc
@@ -165,3 +175,28 @@
/proc/get_timestamp()
return time2text(world.time + 432000, ":ss")
/obj/item/device/detective_scanner/AltClick(mob/living/user)
// Best way for checking if a player can use while not incapacitated, etc
if(!user.canUseTopic(src, be_close=TRUE))
return
if(!LAZYLEN(log))
to_chat(user, "<span class='notice'>Cannot clear logs, the scanner has no logs.</span>")
return
if(scanning)
to_chat(user, "<span class='notice'>Cannot clear logs, the scanner is in use.</span>")
return
to_chat(user, "<span class='notice'>The scanner logs are cleared.</span>")
log = list()
/obj/item/device/detective_scanner/proc/displayDetectiveScanResults(mob/living/user)
// No need for can-use checks since the action button should do proper checks
if(!LAZYLEN(log))
to_chat(user, "<span class='notice'>Cannot display logs, the scanner has no logs.</span>")
return
if(scanning)
to_chat(user, "<span class='notice'>Cannot display logs, the scanner is in use.</span>")
return
to_chat(user, "<span class='notice'><B>Scanner Report</B></span>")
for(var/iterLog in log)
to_chat(user, iterLog)
+2 -1
View File
@@ -355,11 +355,12 @@
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_cross(src, crosser)
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/structure/spacevine/attack_hand(mob/user)
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_hit(src, user)
user_unbuckle_mob(user, user)
. = ..()
/obj/structure/spacevine/attack_paw(mob/living/user)
for(var/datum/spacevine_mutation/SM in mutations)
@@ -91,7 +91,7 @@
head_attack_message = " on the head"
//Knockdown the target for the duration that we calculated and divide it by 5.
if(armor_duration)
target.apply_effect(min(armor_duration, 200) , KNOCKDOWN) // Never knockdown more than a flash!
target.apply_effect(min(armor_duration, 200) , EFFECT_KNOCKDOWN) // Never knockdown more than a flash!
//Display an attack message.
if(target != user)
+1 -1
View File
@@ -362,4 +362,4 @@
if(TB)
TB.MouseDrop(over)
else
..()
return ..()
@@ -146,4 +146,4 @@ God bless America.
reagents.remove_any((reagents.total_volume/2))
C.Knockdown(60)
user.changeNext_move(CLICK_CD_MELEE)
..()
return ..()
@@ -29,11 +29,7 @@
QDEL_NULL(mixer)
return ..()
/obj/machinery/food_cart/attack_hand(mob/user)
user.set_machine(src)
interact(user)
/obj/machinery/food_cart/interact(mob/user)
/obj/machinery/food_cart/ui_interact(mob/user)
var/dat
dat += "<br><b>STORED INGREDIENTS AND DRINKS</b><br><div class='statusDisplay'>"
dat += "Remaining glasses: [glasses]<br>"
@@ -45,7 +45,7 @@
add_overlay("gridle")
/obj/machinery/gibber/attack_paw(mob/user)
return src.attack_hand(user)
return attack_hand(user)
/obj/machinery/gibber/container_resist(mob/living/user)
go_out()
@@ -54,6 +54,9 @@
go_out()
/obj/machinery/gibber/attack_hand(mob/user)
. = ..()
if(.)
return
if(stat & (NOPOWER|BROKEN))
return
if(operating)
@@ -70,11 +70,8 @@
for(var/reagent in icecream_vat_reagents)
reagents.add_reagent(reagent, icecream_vat_reagents[reagent])
/obj/machinery/icecream_vat/attack_hand(mob/user)
user.set_machine(src)
interact(user)
/obj/machinery/icecream_vat/interact(mob/user)
/obj/machinery/icecream_vat/ui_interact(mob/user)
. = ..()
var/dat
dat += "<b>ICE CREAM</b><br><div class='statusDisplay'>"
dat += "<b>Dispensing: [flavour_name] icecream </b> <br><br>"
@@ -156,18 +156,6 @@
..()
updateUsrDialog()
/obj/machinery/microwave/attack_paw(mob/user)
return src.attack_hand(user)
/obj/machinery/microwave/attack_ai(mob/user)
return 0
/obj/machinery/microwave/attack_hand(mob/user)
if(..())
return
user.set_machine(src)
interact(user)
/obj/machinery/microwave/AltClick(mob/user)
if(user.canUseTopic(src, BE_CLOSE) && !(operating || broken > 0 || panel_open || !anchored || dirty == 100))
cook()
@@ -176,7 +164,7 @@
* Microwave Menu
********************/
/obj/machinery/microwave/interact(mob/user) // The microwave Menu
/obj/machinery/microwave/ui_interact(mob/user) // The microwave Menu
if(panel_open || !anchored)
return
var/dat = "<div class='statusDisplay'>"
@@ -75,7 +75,10 @@
/obj/machinery/monkey_recycler/attack_hand(mob/user)
if (src.stat != 0) //NOPOWER etc
. = ..()
if(.)
return
if(stat != 0) //NOPOWER etc
return
if(grinded >= required_grind)
to_chat(user, "<span class='notice'>The machine hisses loudly as it condenses the grinded monkey meat. After a moment, it dispenses a brand new monkey cube.</span>")
@@ -122,6 +122,9 @@
return ..()
/obj/machinery/processor/attack_hand(mob/user)
. = ..()
if(.)
return
if(stat & (NOPOWER|BROKEN))
return
if(src.processing)
@@ -132,18 +132,9 @@
S.remove_from_storage(O,src)
O.forceMove(src)
/obj/machinery/smartfridge/attack_paw(mob/user)
return src.attack_hand(user)
/obj/machinery/smartfridge/attack_ai(mob/user)
return FALSE
/obj/machinery/smartfridge/attack_hand(mob/user)
user.set_machine(src)
interact(user)
/obj/machinery/smartfridge/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
+2 -6
View File
@@ -106,17 +106,16 @@
START_PROCESSING(SSobj, src)
update_icon()
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/pizzabox/attack_hand(mob/user)
if(user.get_inactive_held_item() != src)
..()
return
return ..()
if(open)
if(pizza)
user.put_in_hands(pizza)
to_chat(user, "<span class='notice'>You take [pizza] out of [src].</span>")
pizza = null
update_icon()
return
else if(bomb)
if(wires.is_all_cut() && bomb_defused)
user.put_in_hands(bomb)
@@ -137,7 +136,6 @@
to_chat(user, "<span class='warning'>You trap [src] with [bomb].</span>")
update_icon()
return
else if(boxes.len)
var/obj/item/pizzabox/topbox = boxes[boxes.len]
boxes -= topbox
@@ -146,8 +144,6 @@
topbox.update_icon()
update_icon()
user.regenerate_icons()
return
..()
/obj/item/pizzabox/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/pizzabox))
@@ -14,7 +14,7 @@
subcategory = CAT_EGG
/datum/crafting_recipe/food/omelette
name = "omelette"
name = "Omelette"
reqs = list(
/obj/item/reagent_containers/food/snacks/egg = 2,
/obj/item/reagent_containers/food/snacks/cheesewedge = 2
+3
View File
@@ -59,6 +59,9 @@
shuffle_inplace(cards) // distribute blank cards throughout deck
/obj/item/toy/cards/deck/cas/attack_hand(mob/user)
. = ..()
if(.)
return
if(user.lying)
return
if(cards.len == 0)
+1 -1
View File
@@ -153,7 +153,7 @@
begin_month = APRIL
/datum/holiday/april_fools/celebrate()
SSjob.overflow_role = "Clown"
SSjob.set_overflow_role("Clown")
SSticker.login_music = 'sound/ambience/clown.ogg'
for(var/mob/dead/new_player/P in GLOB.mob_list)
if(P.client)
+2 -2
View File
@@ -1,9 +1,9 @@
//Vars that will not be copied when using /DuplicateObject
GLOBAL_LIST_INIT(duplicate_forbidden_vars,list("tag","area","type","loc","locs","vars", "parent","parent_type", "verbs","ckey","key","power_supply","contents","reagents","stat","x","y","z","group","atmos_adjacent_turfs"))
GLOBAL_LIST_INIT(duplicate_forbidden_vars,list("tag", "datum_components", "area","type","loc","locs","vars", "parent","parent_type", "verbs","ckey","key","power_supply","contents","reagents","stat","x","y","z","group","atmos_adjacent_turfs"))
/proc/DuplicateObject(atom/original, perfectcopy = TRUE, sameloc = FALSE, atom/newloc = null, nerf = FALSE, holoitem=FALSE)
if(!original)
return null
return
var/atom/O
if(sameloc)
+1 -1
View File
@@ -76,7 +76,7 @@
mob = new mobtype(loc)
// these vars are not really standardized but all would theoretically create stuff on death
for(var/v in list("butcher_results","corpse","weapon1","weapon2","blood_volume") & mob.vars)
for(var/v in list("butcher_results","corpse","weapon1","weapon2","blood_volume","vore_organs") & mob.vars) //CITADEL EDIT, maybe stops ghost bellies
mob.vars[v] = null
return mob
+6
View File
@@ -108,6 +108,9 @@
visible_message("<span class='warning'> [user] dunks [W] into \the [src]!</span>")
/obj/structure/holohoop/attack_hand(mob/user)
. = ..()
if(.)
return
if(user.pulling && user.a_intent == INTENT_GRAB && isliving(user.pulling))
var/mob/living/L = user.pulling
if(user.grab_state < GRAB_AGGRESSIVE)
@@ -165,6 +168,9 @@
to_chat(user, "The device is a solid button, there's nothing you can do with it!")
/obj/machinery/readybutton/attack_hand(mob/user as mob)
. = ..()
if(.)
return
if(user.stat || stat & (NOPOWER|BROKEN))
to_chat(user, "<span class='warning'>This device is not powered!</span>")
return
@@ -192,8 +192,8 @@
..()
/obj/structure/beebox/attack_hand(mob/user)
/obj/structure/beebox/interact(mob/user)
. = ..()
if(!user.bee_friendly())
//Time to get stung!
var/bees = FALSE
+4 -9
View File
@@ -151,10 +151,10 @@
else
to_chat(user, "<span class='warning'>You cannot put this in [src.name]!</span>")
/obj/machinery/biogenerator/interact(mob/user)
/obj/machinery/biogenerator/ui_interact(mob/user)
if(stat & BROKEN || panel_open)
return
user.set_machine(src)
. = ..()
var/dat
if(processing)
dat += "<div class='statusDisplay'>Biogenerator is processing! Please wait...</div><BR>"
@@ -202,15 +202,11 @@
var/datum/browser/popup = new(user, "biogen", name, 350, 520)
popup.set_content(dat)
popup.open()
return
/obj/machinery/biogenerator/attack_hand(mob/user)
interact(user)
/obj/machinery/biogenerator/proc/activate()
if (usr.stat != 0)
if (usr.stat != CONSCIOUS)
return
if (src.stat != 0) //NOPOWER etc
if (src.stat != NONE) //NOPOWER etc
return
if(processing)
to_chat(usr, "<span class='warning'>The biogenerator is in the process of working.</span>")
@@ -233,7 +229,6 @@
update_icon()
else
menustat = "void"
return
/obj/machinery/biogenerator/proc/check_cost(list/materials, multiplier = 1, remove_points = 1)
if(materials.len != 1 || materials[1] != MAT_BIOMASS)
+2 -8
View File
@@ -98,14 +98,8 @@
else
..()
/obj/machinery/plantgenes/attack_hand(mob/user)
if(..())
return
interact(user)
/obj/machinery/plantgenes/interact(mob/user)
user.set_machine(src)
/obj/machinery/plantgenes/ui_interact(mob/user)
. = ..()
if(!user)
return
+3 -1
View File
@@ -78,7 +78,9 @@
foodtype = FRUIT
/obj/item/reagent_containers/food/snacks/grown/ghost_chili/attack_hand(mob/user)
..()
. = ..()
if(.)
return
if( ismob(loc) )
held_mob = loc
START_PROCESSING(SSobj, src)
+3 -2
View File
@@ -161,6 +161,9 @@
/obj/structure/bonfire/attack_hand(mob/user)
. = ..()
if(.)
return
if(burning)
to_chat(user, "<span class='warning'>You need to extinguish [src] before removing the logs!</span>")
return
@@ -173,8 +176,6 @@
new /obj/item/stack/rods(loc, 1)
qdel(src)
return
..()
/obj/structure/bonfire/proc/CheckOxygen()
if(isopenturf(loc))
+1 -1
View File
@@ -131,7 +131,7 @@
playsound(src,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1)
return (BRUTELOSS)
/obj/item/scythe/pre_attackby(atom/A, mob/living/user, params)
/obj/item/scythe/pre_attack(atom/A, mob/living/user, params)
if(swiping || !istype(A, /obj/structure/spacevine) || get_turf(A) == get_turf(user))
return ..()
else
+3
View File
@@ -847,6 +847,9 @@
return ..()
/obj/machinery/hydroponics/attack_hand(mob/user)
. = ..()
if(.)
return
if(issilicon(user)) //How does AI know what plant is?
return
if(harvest)
+2 -6
View File
@@ -119,13 +119,9 @@
src.potency = poten
src.amount = am
/obj/machinery/seed_extractor/attack_hand(mob/user)
user.set_machine(src)
interact(user)
/obj/machinery/seed_extractor/interact(mob/user)
/obj/machinery/seed_extractor/ui_interact(mob/user)
if (stat)
return 0
return FALSE
var/dat = "<b>Stored seeds:</b><br>"
@@ -107,8 +107,11 @@
if(!draw_power(IC.power_draw_idle))
IC.power_fail()
/obj/item/device/electronic_assembly/interact(mob/user)
ui_interact(user)
/obj/item/device/electronic_assembly/ui_interact(mob/user)
. = ..()
if(!check_interactivity(user))
return
@@ -118,6 +118,10 @@ a creative player the means to solve many problems. Circuits are held inside an
displayed_name = input
/obj/item/integrated_circuit/interact(mob/user)
ui_interact(user)
/obj/item/integrated_circuit/ui_interact(mob/user)
. = ..()
if(!check_interactivity(user))
return
@@ -7,6 +7,7 @@
interact(user)
/datum/integrated_io/lists/proc/interact(mob/user)
. = ..()
var/list/my_list = data
var/t = "<h2>[src]</h2><br>"
t += "List length: [my_list.len]<br>"
+2 -11
View File
@@ -6,8 +6,8 @@ Assistant
flag = ASSISTANT
department_flag = CIVILIAN
faction = "Station"
total_positions = -1
spawn_positions = -1
total_positions = 5
spawn_positions = 5
supervisors = "absolutely everyone"
selection_color = "#dddddd"
access = list() //See /datum/job/assistant/get_access()
@@ -23,15 +23,6 @@ Assistant
else
return ..()
/datum/job/assistant/config_check()
var/ac = CONFIG_GET(number/assistant_cap)
if(ac != 0)
total_positions = ac
spawn_positions = ac
return 1
return 0
/datum/outfit/job/assistant
name = "Assistant"
jobtype = /datum/job/assistant
+1 -1
View File
@@ -69,7 +69,7 @@ Head of Personnel
minimal_player_age = 10
exp_requirements = 180
exp_type = EXP_TYPE_CREW
//exp_type_department = EXP_TYPE_SUPPLY - CITADEL CHANGE
exp_type_department = EXP_TYPE_SUPPLY
antag_rep = 20
outfit = /datum/outfit/job/hop
+3
View File
@@ -117,6 +117,9 @@
/obj/structure/bookcase/attack_hand(mob/user)
. = ..()
if(.)
return
if(contents.len)
var/obj/item/book/choice = input("Which book would you like to remove from the shelf?") as null|obj in contents
if(choice)

Some files were not shown because too many files have changed in this diff Show More