Merge remote-tracking branch 'origin/master' into motivation

This commit is contained in:
keronshb
2021-01-29 09:29:55 -05:00
803 changed files with 8615 additions and 5542 deletions
+15 -9
View File
@@ -87,16 +87,22 @@
M.IgniteMob()
/atom/movable/proc/unbuckle_mob(mob/living/buckled_mob, force=FALSE)
if(istype(buckled_mob) && buckled_mob.buckled == src && (buckled_mob.can_unbuckle() || force))
. = buckled_mob
buckled_mob.buckled = null
buckled_mob.anchored = initial(buckled_mob.anchored)
buckled_mob.update_mobility()
buckled_mob.clear_alert("buckled")
buckled_mobs -= buckled_mob
SEND_SIGNAL(src, COMSIG_MOVABLE_UNBUCKLE, buckled_mob, force)
if(!isliving(buckled_mob))
CRASH("Non-living [buckled_mob] thing called unbuckle_mob() for source.")
if(buckled_mob.buckled != src)
CRASH("[buckled_mob] called unbuckle_mob() for source while having buckled as [buckled_mob.buckled].")
if(!force && !buckled_mob.can_unbuckle())
return
. = buckled_mob
buckled_mob.buckled = null
buckled_mob.anchored = initial(buckled_mob.anchored)
buckled_mob.update_mobility()
buckled_mob.clear_alert("buckled")
buckled_mob.set_glide_size(DELAY_TO_GLIDE_SIZE(buckled_mob.total_multiplicative_slowdown()))
buckled_mobs -= buckled_mob
SEND_SIGNAL(src, COMSIG_MOVABLE_UNBUCKLE, buckled_mob, force)
post_unbuckle_mob(.)
post_unbuckle_mob(.)
/atom/movable/proc/unbuckle_all_mobs(force=FALSE)
if(!has_buckled_mobs())
+1
View File
@@ -53,6 +53,7 @@
return 0
/obj/effect/acid/Crossed(AM as mob|obj)
. = ..()
if(isliving(AM))
var/mob/living/L = AM
if(L.movement_type & FLYING)
+1 -1
View File
@@ -138,7 +138,7 @@
/obj/effect/anomaly/grav/high/Initialize(mapload, new_lifespan)
. = ..()
setup_grav_field()
INVOKE_ASYNC(src, .proc/setup_grav_field)
/obj/effect/anomaly/grav/high/proc/setup_grav_field()
grav_field = make_field(/datum/proximity_monitor/advanced/gravity, list("current_range" = 7, "host" = src, "gravity_value" = rand(0,3)))
@@ -69,4 +69,5 @@
persistent = FALSE
/obj/effect/decal/cleanable/oil/slippery/Initialize()
. = ..()
AddComponent(/datum/component/slippery, 80, (NO_SLIP_WHEN_WALKING | SLIDE))
+39 -3
View File
@@ -49,6 +49,42 @@
/obj/effect/overlay/vis
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
anchored = TRUE
vis_flags = NONE
var/unused = 0 //When detected to be unused it gets set to world.time, after a while it gets removed
var/cache_expiration = 2 MINUTES // overlays which go unused for 2 minutes get cleaned up
vis_flags = VIS_INHERIT_DIR
///When detected to be unused it gets set to world.time, after a while it gets removed
var/unused = 0
///overlays which go unused for this amount of time get cleaned up
var/cache_expiration = 2 MINUTES
// /obj/effect/overlay/atmos_excited
// name = "excited group"
// icon = null
// icon_state = null
// anchored = TRUE // should only appear in vis_contents, but to be safe
// appearance_flags = RESET_TRANSFORM | TILE_BOUND
// invisibility = INVISIBILITY_ABSTRACT
// mouse_opacity = MOUSE_OPACITY_TRANSPARENT
// layer = ATMOS_GROUP_LAYER
// plane = ATMOS_GROUP_PLANE
// /obj/effect/overlay/light_visible
// name = ""
// icon = 'icons/effects/light_overlays/light_32.dmi'
// icon_state = "light"
// layer = O_LIGHTING_VISUAL_LAYER
// plane = O_LIGHTING_VISUAL_PLANE
// appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
// mouse_opacity = MOUSE_OPACITY_TRANSPARENT
// alpha = 0
// vis_flags = NONE
// /obj/effect/overlay/light_cone
// name = ""
// icon = 'icons/effects/light_overlays/light_cone.dmi'
// icon_state = "light"
// layer = O_LIGHTING_VISUAL_LAYER
// plane = O_LIGHTING_VISUAL_PLANE
// appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
// mouse_opacity = MOUSE_OPACITY_TRANSPARENT
// vis_flags = NONE
// alpha = 110
+7 -1
View File
@@ -5,6 +5,7 @@
var/list/checkers //list of /obj/effect/abstract/proximity_checkers
var/current_range
var/ignore_if_not_on_turf //don't check turfs in range if the host's loc isn't a turf
var/wire = FALSE
/datum/proximity_monitor/New(atom/_host, range, _ignore_if_not_on_turf = TRUE)
checkers = list()
@@ -35,6 +36,8 @@
return ..()
/datum/proximity_monitor/proc/HandleMove()
SIGNAL_HANDLER
var/atom/_host = host
var/atom/new_host_loc = _host.loc
if(last_host_loc != new_host_loc)
@@ -58,6 +61,8 @@
var/atom/_host = host
var/atom/loc_to_use = ignore_if_not_on_turf ? _host.loc : get_turf(_host)
if(wire && !isturf(loc_to_use)) //it makes assemblies attached on wires work
loc_to_use = get_turf(loc_to_use)
if(!isturf(loc_to_use)) //only check the host's loc
if(range)
var/obj/effect/abstract/proximity_checker/pc
@@ -109,4 +114,5 @@
/obj/effect/abstract/proximity_checker/Crossed(atom/movable/AM)
set waitfor = FALSE
monitor?.hasprox_receiver.HasProximity(AM)
. = ..()
monitor?.hasprox_receiver?.HasProximity(AM)
@@ -170,6 +170,7 @@
/obj/item/clothing/under/rank/civilian/mime/sexy)
/obj/effect/spawner/bundle/crate/Initialize(mapload)
SHOULD_CALL_PARENT(FALSE)
if(items && items.len)
var/turf/T = get_turf(src)
var/obj/structure/closet/LC = locate(/obj/structure/closet) in T
@@ -15,5 +15,5 @@
message_admins("An alien egg has been delivered to [ADMIN_VERBOSEJMP(T)].")
log_game("An alien egg has been delivered to [AREACOORD(T)]")
var/message = "Attention [station_name()], we have entrusted you with a research specimen in [get_area_name(T, TRUE)]. Remember to follow all safety precautions when dealing with the specimen."
SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, /proc/addtimer, CALLBACK(GLOBAL_PROC, /proc/print_command_report, message), announcement_time))
SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, /proc/_addtimer, CALLBACK(GLOBAL_PROC, /proc/print_command_report, message), announcement_time))
return INITIALIZE_HINT_QDEL
+39 -18
View File
@@ -11,7 +11,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
name = "item"
icon = 'icons/obj/items_and_weapons.dmi'
blocks_emissive = EMISSIVE_BLOCK_GENERIC
attack_hand_speed = 0
attack_hand_is_action = FALSE
attack_hand_unwieldlyness = 0
@@ -428,18 +428,19 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
/obj/item/proc/talk_into(mob/M, input, channel, spans, datum/language/language)
return ITALICS | REDUCE_RANGE
/obj/item/proc/dropped(mob/user)
/// Called when a mob drops an item.
/obj/item/proc/dropped(mob/user, silent = FALSE)
SHOULD_CALL_PARENT(TRUE)
current_equipped_slot = null
for(var/X in actions)
var/datum/action/A = X
A.Remove(user)
if(item_flags & DROPDEL)
qdel(src)
item_flags &= ~IN_INVENTORY
if(SEND_SIGNAL(src, COMSIG_ITEM_DROPPED,user) & COMPONENT_DROPPED_RELOCATION)
. = ITEM_RELOCATED_BY_DROPPED
user.update_equipment_speed_mods()
SEND_SIGNAL(src, COMSIG_ITEM_DROPPED,user)
// if(!silent)
// playsound(src, drop_sound, DROP_SOUND_VOLUME, ignore_walls = FALSE)
user?.update_equipment_speed_mods()
// called just as an item is picked up (loc is not yet changed)
/obj/item/proc/pickup(mob/user)
@@ -467,29 +468,43 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
melee_attack_chain(usr, over)
usr.FlushCurrentAction()
return TRUE //returning TRUE as a "is this overridden?" flag
if(isrevenant(usr))
if(RevenantThrow(over, usr, src))
return
if(!Adjacent(usr) || !over.Adjacent(usr))
return // should stop you from dragging through windows
over.MouseDrop_T(src,usr)
return
// called after an item is placed in an equipment slot
// user is mob that equipped it
// slot uses the slot_X defines found in setup.dm
// for items that can be placed in multiple slots
// note this isn't called during the initial dressing of a player
/obj/item/proc/equipped(mob/user, slot)
/**
* Called after an item is placed in an equipment slot.
*
* Note that hands count as slots.
*
* Arguments:
* * user is mob that equipped it
* * slot uses the slot_X defines found in setup.dm for items that can be placed in multiple slots
* * Initial is used to indicate whether or not this is the initial equipment (job datums etc) or just a player doing it
*/
/obj/item/proc/equipped(mob/user, slot, initial = FALSE)
SHOULD_CALL_PARENT(TRUE)
. = SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot)
SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot)
current_equipped_slot = slot
if(!(. & COMPONENT_NO_GRANT_ACTIONS))
for(var/X in actions)
var/datum/action/A = X
if(item_action_slot_check(slot, user, A)) //some items only give their actions buttons when in a specific slot.
A.Grant(user)
for(var/X in actions)
var/datum/action/A = X
if(item_action_slot_check(slot, user, A)) //some items only give their actions buttons when in a specific slot.
A.Grant(user)
item_flags |= IN_INVENTORY
// if(!initial)
// if(equip_sound && (slot_flags & slot))
// playsound(src, equip_sound, EQUIP_SOUND_VOLUME, TRUE, ignore_walls = FALSE)
// else if(slot == ITEM_SLOT_HANDS)
// playsound(src, pickup_sound, PICKUP_SOUND_VOLUME, ignore_walls = FALSE)
user.update_equipment_speed_mods()
//Overlays for the worn overlay so you can overlay while you overlay
//eg: ammo counters, primed grenade flashing, etc.
//"icon_file" is used automatically for inhands etc. to make sure it gets the right inhand file
@@ -656,6 +671,8 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
else
playsound(hit_atom, 'sound/weapons/throwtap.ogg', 1, volume, -1)
// else
// playsound(src, drop_sound, YEET_SOUND_VOLUME, ignore_walls = FALSE)
return hit_atom.hitby(src, 0, itempush, throwingdatum=throwingdatum)
/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, messy_throw = TRUE)
@@ -926,6 +943,10 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
/obj/item/proc/get_part_rating()
return 0
//Can this item be given to people?
/obj/item/proc/can_give()
return TRUE
/obj/item/doMove(atom/destination)
if (ismob(loc))
var/mob/M = loc
+1 -1
View File
@@ -166,7 +166,7 @@
last = C
break
obj/item/rcl/proc/getMobhook(mob/to_hook)
/obj/item/rcl/proc/getMobhook(mob/to_hook)
if(listeningTo == to_hook)
return
if(listeningTo)
+4
View File
@@ -82,4 +82,8 @@
/obj/item/candle/infinite/hugbox
heats_space = FALSE
/obj/item/candle/DoRevenantThrowEffects(atom/target)
if(!infinite)
put_out_candle()
#undef CANDLE_LUMINOSITY
+25 -1
View File
@@ -779,16 +779,40 @@
/obj/item/card/id/departmental_budget/update_label()
return
/obj/item/card/id/departmental_budget/civ
department_ID = ACCOUNT_CIV
department_name = ACCOUNT_CIV_NAME
/obj/item/card/id/departmental_budget/eng
department_ID = ACCOUNT_ENG
department_name = ACCOUNT_ENG_NAME
/obj/item/card/id/departmental_budget/sci
department_ID = ACCOUNT_SCI
department_name = ACCOUNT_SCI_NAME
/obj/item/card/id/departmental_budget/med
department_ID = ACCOUNT_MED
department_name = ACCOUNT_MED_NAME
/obj/item/card/id/departmental_budget/srv
department_ID = ACCOUNT_SRV
department_name = ACCOUNT_SRV_NAME
/obj/item/card/id/departmental_budget/car
department_ID = ACCOUNT_CAR
department_name = ACCOUNT_CAR_NAME
/obj/item/card/id/departmental_budget/sec
department_ID = ACCOUNT_SEC
department_name = ACCOUNT_SEC_NAME
//Polychromatic Knight Badge
/obj/item/card/id/knight
name = "knight badge"
icon_state = "knight"
desc = "A badge denoting the owner as a knight! It has a strip for swiping like an ID"
desc = "A badge denoting the owner as a knight! It has a strip for swiping like an ID."
var/id_color = "#00FF00" //defaults to green
var/mutable_appearance/id_overlay
+9
View File
@@ -136,6 +136,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM
STOP_PROCESSING(SSobj, src)
. = ..()
/obj/item/clothing/mask/cigarette/DoRevenantThrowEffects(atom/target)
if(lit)
attackby()
else
light()
/obj/item/clothing/mask/cigarette/attackby(obj/item/W, mob/user, params)
if(!lit && smoketime > 0)
var/lighting_text = W.ignition_effect(src, user)
@@ -517,6 +523,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM
overlay_state = pick(overlay_list)
update_icon()
/obj/item/lighter/DoRevenantThrowEffects(atom/target)
set_lit()
/obj/item/lighter/suicide_act(mob/living/carbon/user)
if (lit)
user.visible_message("<span class='suicide'>[user] begins holding \the [src]'s flame up to [user.p_their()] face! It looks like [user.p_theyre()] trying to commit suicide!</span>")
@@ -263,6 +263,7 @@
/obj/machinery/vending/cola = "Robust Softdrinks",
/obj/machinery/vending/cigarette = "ShadyCigs Deluxe",
/obj/machinery/vending/games = "\improper Good Clean Fun",
/obj/machinery/vending/kink = "KinkMate",
/obj/machinery/vending/autodrobe = "AutoDrobe",
/obj/machinery/vending/assist = "\improper Vendomat",
/obj/machinery/vending/engivend = "\improper Engi-Vend",
@@ -347,9 +347,9 @@
last_hearcheck = world.time
for(var/mob/H in hearing_mobs)
if(!istype(H.loc, /obj/item/dogborg/sleeper))
H.playsound_local(source, null, 45, falloff = 0, S = pred_death)
H.playsound_local(source, null, 45, S = pred_death)
else if(H in contents)
H.playsound_local(source, null, 65, falloff = 0, S = prey_death)
H.playsound_local(source, null, 65, S = prey_death)
for(var/belly in T.vore_organs)
var/obj/belly/B = belly
for(var/atom/movable/thing in B)
@@ -391,9 +391,9 @@
last_hearcheck = world.time
for(var/mob/H in hearing_mobs)
if(!istype(H.loc, /obj/item/dogborg/sleeper))
H.playsound_local(source, null, 45, falloff = 0, S = pred_digest)
H.playsound_local(source, null, 45, S = pred_digest)
else if(H in contents)
H.playsound_local(source, null, 65, falloff = 0, S = prey_digest)
H.playsound_local(source, null, 65, S = prey_digest)
update_gut(hound)
@@ -37,11 +37,14 @@
/obj/item/flashlight/attack_self(mob/user)
on = !on
update_brightness(user)
playsound(user, on ? 'sound/weapons/magin.ogg' : 'sound/weapons/magout.ogg', 40, 1)
playsound(src, on ? 'sound/weapons/magin.ogg' : 'sound/weapons/magout.ogg', 40, TRUE)
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
return 1
return TRUE
/obj/item/flashlight/DoRevenantThrowEffects(atom/target)
attack_self()
/obj/item/flashlight/suicide_act(mob/living/carbon/human/user)
if (user.eye_blind)
+5 -1
View File
@@ -8,10 +8,11 @@
slot_flags = ITEM_SLOT_BELT
obj_flags = UNIQUE_RENAME
var/gpstag = "COM0"
var/starton = TRUE
/obj/item/gps/Initialize()
. = ..()
AddComponent(/datum/component/gps/item, gpstag)
AddComponent(/datum/component/gps/item, gpstag, starton)
/obj/item/gps/science
icon_state = "gps-s"
@@ -26,6 +27,9 @@
gpstag = "MINE0"
desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life."
/obj/item/gps/mining/off
starton = FALSE
/obj/item/gps/cyborg
icon_state = "gps-b"
gpstag = "BORG0"
@@ -283,14 +283,12 @@ GLOBAL_LIST_INIT(channel_tokens, list(
SSradio.remove_object(src, GLOB.radiochannels[ch_name])
secure_radio_connections[ch_name] = null
var/turf/T = user.drop_location()
if(T)
if(keyslot)
keyslot.forceMove(T)
keyslot = null
if(keyslot2)
keyslot2.forceMove(T)
keyslot2 = null
if(keyslot)
user.put_in_hands(keyslot)
keyslot = null
if(keyslot2)
user.put_in_hands(keyslot2)
keyslot2 = null
recalculateChannels()
to_chat(user, "<span class='notice'>You pop out the encryption keys in the headset.</span>")
@@ -306,18 +306,6 @@ GENETICS SCANNER
if(T.name == "fluffy tongue")
temp_message += " <span class='danger'>Subject is suffering from a fluffified tongue. Suggested cure: Yamerol or a tongue transplant.</span>"
//HECK
else if(istype(O, /obj/item/organ/genital/penis))
var/obj/item/organ/genital/penis/P = O
if(P.length>20)
temp_message += " <span class='info'>Subject has a sizeable gentleman's organ at [P.length] inches.</span>"
else if(istype(O, /obj/item/organ/genital/breasts))
var/obj/item/organ/genital/breasts/Br = O
if(Br.cached_size>5)
temp_message += " <span class='info'>Subject has a sizeable bosom with a [Br.size] cup.</span>"
//GENERAL HANDLER
if(!damage_message)
+3
View File
@@ -46,6 +46,9 @@
if(.)
new /obj/item/toy/eightball/haunted(loc)
/obj/item/toy/eightball/DoRevenantThrowEffects(atom/target)
MakeHaunted()
/obj/item/toy/eightball/attack_self(mob/user)
if(shaking)
return
+11 -4
View File
@@ -235,16 +235,23 @@
return
EmptyExtinguisher(user)
/obj/item/extinguisher/proc/EmptyExtinguisher(var/mob/user)
if(loc == user && reagents.total_volume)
/obj/item/extinguisher/DoRevenantThrowEffects(atom/target)
EmptyExtinguisher()
/obj/item/extinguisher/proc/EmptyExtinguisher(mob/user)
if(!reagents.total_volume)
return
if(loc == user || !user)
reagents.clear_reagents()
var/turf/T = get_turf(loc)
if(isopenturf(T))
var/turf/open/theturf = T
theturf.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS)
user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "<span class='info'>You quietly empty out \the [src] by using its release valve.</span>")
if(user)
user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "<span class='info'>You quietly empty out \the [src] by using its release valve.</span>")
else
user.visible_message("The release valve of \the [src] suddenly opens and sprays it's contents on the floor!")
//firebot assembly
/obj/item/extinguisher/attackby(obj/O, mob/user, params)
@@ -85,6 +85,7 @@
/obj/item/grenade/plastic/Crossed(atom/movable/AM)
if(nadeassembly)
nadeassembly.Crossed(AM)
. = ..()
/obj/item/grenade/plastic/on_found(mob/finder)
if(nadeassembly)
+33 -9
View File
@@ -19,6 +19,8 @@
var/minimum_range = 0 //at what range the pinpointer declares you to be at your destination
var/ignore_suit_sensor_level = FALSE // Do we find people even if their suit sensors are turned off
var/alert = FALSE // TRUE to display things more seriously
/// resets target on toggle
var/resets_target = TRUE
/obj/item/pinpointer/Initialize()
. = ..()
@@ -27,17 +29,22 @@
/obj/item/pinpointer/Destroy()
STOP_PROCESSING(SSfastprocess, src)
GLOB.pinpointer_list -= src
target = null
unset_target()
return ..()
/obj/item/pinpointer/DoRevenantThrowEffects(atom/target)
attack_self()
/obj/item/pinpointer/attack_self(mob/living/user)
active = !active
user.visible_message("<span class='notice'>[user] [active ? "" : "de"]activates [user.p_their()] pinpointer.</span>", "<span class='notice'>You [active ? "" : "de"]activate your pinpointer.</span>")
if(user)
user.visible_message("<span class='notice'>[user] [active ? "" : "de"]activates [user.p_their()] pinpointer.</span>", "<span class='notice'>You [active ? "" : "de"]activate your pinpointer.</span>")
playsound(src, 'sound/items/screwdriver2.ogg', 50, 1)
if(active)
START_PROCESSING(SSfastprocess, src)
else
target = null
if(resets_target)
unset_target()
STOP_PROCESSING(SSfastprocess, src)
update_icon()
@@ -50,6 +57,18 @@
/obj/item/pinpointer/proc/scan_for_target()
return
/obj/item/pinpointer/proc/set_target(atom/movable/newtarget)
if(target)
unset_target()
target = newtarget
RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/unset_target)
/obj/item/pinpointer/proc/unset_target()
if(!target)
return
UnregisterSignal(target, COMSIG_PARENT_QDELETING)
target = null
/obj/item/pinpointer/update_overlays()
. = ..()
if(!active)
@@ -101,7 +120,8 @@
active = FALSE
user.visible_message("<span class='notice'>[user] deactivates [user.p_their()] pinpointer.</span>", "<span class='notice'>You deactivate your pinpointer.</span>")
playsound(src, 'sound/items/screwdriver2.ogg', 50, 1)
target = null //Restarting the pinpointer forces a target reset
if(resets_target)
unset_target() //Restarting the pinpointer forces a target reset
STOP_PROCESSING(SSfastprocess, src)
update_icon()
return
@@ -137,7 +157,7 @@
if(!A || QDELETED(src) || !user || !user.is_holding(src) || user.incapacitated())
return
target = names[A]
set_target(names[A])
active = TRUE
user.visible_message("<span class='notice'>[user] activates [user.p_their()] pinpointer.</span>", "<span class='notice'>You activate your pinpointer.</span>")
playsound(src, 'sound/items/screwdriver2.ogg', 50, 1)
@@ -149,7 +169,7 @@
if(ishuman(target))
var/mob/living/carbon/human/H = target
if(!trackable(H))
target = null
unset_target()
if(!target) //target can be set to null from above code, or elsewhere
active = FALSE
@@ -163,7 +183,7 @@
. = ..()
/obj/item/pinpointer/pair/scan_for_target()
target = other_pair
set_target(other_pair)
/obj/item/pinpointer/pair/examine(mob/user)
. = ..()
@@ -195,7 +215,7 @@
shuttleport = SSshuttle.getShuttle("huntership")
/obj/item/pinpointer/shuttle/scan_for_target()
target = shuttleport
set_target(shuttleport)
/obj/item/pinpointer/shuttle/Destroy()
shuttleport = null
@@ -207,4 +227,8 @@
icon_state = "pinpointer_ian"
/obj/item/pinpointer/ian/scan_for_target()
target = locate(/mob/living/simple_animal/pet/dog/corgi/Ian) in GLOB.mob_living_list
set_target(locate(/mob/living/simple_animal/pet/dog/corgi/Ian) in GLOB.mob_living_list)
/obj/item/pinpointer/custom
resets_target = FALSE
+5
View File
@@ -45,6 +45,10 @@
return
set_snowflake_from_config(id)
/obj/item/toy/plush/DoRevenantThrowEffects(atom/target)
var/datum/component/squeak/squeaker = GetComponent(/datum/component/squeak)
squeaker.do_play_squeak(TRUE)
/obj/item/toy/plush/Initialize(mapload, set_snowflake_id)
. = ..()
AddComponent(/datum/component/squeak, squeak_override)
@@ -462,6 +466,7 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
can_random_spawn = FALSE
/obj/item/toy/plush/random/Initialize()
SHOULD_CALL_PARENT(FALSE)
var/newtype
var/list/snowflake_list = CONFIG_GET(keyed_list/snowflake_plushies)
+30 -12
View File
@@ -43,6 +43,13 @@
/obj/item/pneumatic_cannon/proc/init_charge() //wrapper so it can be vv'd easier
START_PROCESSING(SSobj, src)
/obj/item/pneumatic_cannon/DoRevenantThrowEffects(atom/target)
var/picked_target
var/list/possible_targets = range(3,src)
picked_target = pick(possible_targets)
if(target)
Fire(null, picked_target)
/obj/item/pneumatic_cannon/process()
if(++charge_tick >= charge_ticks && charge_type)
fill_with_type(charge_type, charge_amount)
@@ -134,21 +141,29 @@
Fire(user, target)
/obj/item/pneumatic_cannon/proc/Fire(mob/living/user, var/atom/target)
if(!istype(user) && !target)
if(!target)
return
if(user)
if(!isliving(user))
return
var/discharge = 0
if(!can_trigger_gun(user))
if(user && !can_trigger_gun(user))
return
if(!loadedItems || !loadedWeightClass)
to_chat(user, "<span class='warning'>\The [src] has nothing loaded.</span>")
if(user)
to_chat(user, "<span class='warning'>\The [src] has nothing loaded.</span>")
return
if(!tank && checktank)
to_chat(user, "<span class='warning'>\The [src] can't fire without a source of gas.</span>")
if(user)
to_chat(user, "<span class='warning'>\The [src] can't fire without a source of gas.</span>")
return
if(tank && !tank.air_contents.remove(gasPerThrow * pressureSetting))
to_chat(user, "<span class='warning'>\The [src] lets out a weak hiss and doesn't react!</span>")
if(user)
to_chat(user, "<span class='warning'>\The [src] lets out a weak hiss and doesn't react!</span>")
else
visible_message(src, "<span class='warning'>\The [src] lets out a weak hiss and doesn't react!</span>")
return
if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(75) && clumsyCheck && iscarbon(user))
if(user && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(75) && clumsyCheck && iscarbon(user))
var/mob/living/carbon/C = user
C.visible_message("<span class='warning'>[C] loses [C.p_their()] grip on [src], causing it to go off!</span>", "<span class='userdanger'>[src] slips out of your hands and goes off!</span>")
C.dropItemToGround(src, TRUE)
@@ -157,15 +172,18 @@
else
var/list/possible_targets = range(3,src)
target = pick(possible_targets)
discharge = 1
if(!discharge)
discharge = TRUE
if(!discharge && user)
user.visible_message("<span class='danger'>[user] fires \the [src]!</span>", \
"<span class='danger'>You fire \the [src]!</span>")
log_combat(user, target, "fired at", src)
var/turf/T = get_target(target, get_turf(src))
playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, 1)
fire_items(T, user)
if(pressureSetting >= 3 && iscarbon(user))
playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, TRUE)
if(user)
log_combat(user, target, "fired at", src)
fire_items(T, user)
else
fire_items(T)
if(user && pressureSetting >= 3 && iscarbon(user))
var/mob/living/carbon/C = user
C.visible_message("<span class='warning'>[C] is thrown down by the force of the cannon!</span>", "<span class='userdanger'>[src] slams into your shoulder, knocking you down!")
C.DefaultCombatKnockdown(60)
+1 -1
View File
@@ -134,7 +134,7 @@
/obj/item/pressure_plate/hologrid/Crossed(atom/movable/AM)
. = ..()
if(trigger_item && istype(AM, specific_item) && !claimed)
AM.anchored = TRUE
AM.set_anchored(TRUE)
flick("laserbox_burn", AM)
trigger()
QDEL_IN(src, 15)
+1 -1
View File
@@ -258,7 +258,7 @@
shield_flags = SHIELD_FLAGS_DEFAULT
max_integrity = 300
obj/item/shield/riot/bullet_proof
/obj/item/shield/riot/bullet_proof
name = "bullet resistant shield"
desc = "A far more frail shield made of resistant plastics and kevlar meant to block ballistics."
armor = list("melee" = 30, "bullet" = 80, "laser" = 0, "energy" = 0, "bomb" = -40, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50)
+1 -1
View File
@@ -65,7 +65,7 @@
if(merge)
for(var/obj/item/stack/S in loc)
if(S.merge_type == merge_type)
merge(S)
INVOKE_ASYNC(src, .proc/merge, S)
var/list/temp_recipes = get_main_recipes()
recipes = temp_recipes.Copy()
if(material_type)
+1 -1
View File
@@ -639,7 +639,7 @@
new /obj/item/bikehorn(src)
new /obj/item/implanter/sad_trombone(src)
obj/item/storage/backpack/duffelbag/syndie/shredderbundle
/obj/item/storage/backpack/duffelbag/syndie/shredderbundle
desc = "A large duffel bag containing two CX Shredders, some magazines, an elite hardsuit, and a chest rig."
/obj/item/storage/backpack/duffelbag/syndie/shredderbundle/PopulateContents()
+1 -1
View File
@@ -857,7 +857,7 @@
icon_state = "2sheath"
item_state = "katana" //this'll do.
w_class = WEIGHT_CLASS_BULKY
fitting_swords = list(/obj/item/melee/smith/wakizashi, /obj/item/melee/smith/twohand/katana, /obj/item/melee/bokken)
fitting_swords = list(/obj/item/melee/smith/wakizashi, /obj/item/melee/smith/twohand/katana, /obj/item/melee/bokken, /obj/item/katana)
starting_sword = null
/obj/item/storage/belt/sabre/twin/ComponentInitialize()
+1 -1
View File
@@ -275,7 +275,7 @@
for(var/i in 1 to 7)
new /obj/item/grenade/flashbang(src)
obj/item/storage/box/stingbangs
/obj/item/storage/box/stingbangs
name = "box of stingbangs (WARNING)"
desc = "<B>WARNING: These devices are extremely dangerous and can cause severe injuries or death in repeated use.</B>"
icon_state = "secbox"
+23 -13
View File
@@ -47,6 +47,9 @@
cell = new preload_cell_type(src)
update_icon()
/obj/item/melee/baton/DoRevenantThrowEffects(atom/target)
switch_status()
/obj/item/melee/baton/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
..()
//Only mob/living types have stun handling
@@ -236,6 +239,12 @@
if(!iscyborg(loc))
deductcharge(severity*10, TRUE, FALSE)
/obj/item/melee/baton/can_give()
if(turned_on)
return FALSE
else
..()
/obj/item/melee/baton/stunsword
name = "stunsword"
desc = "Not actually sharp, this sword is functionally identical to its baton counterpart."
@@ -269,21 +278,22 @@
icon_state = "refill_donksoft"
var/product = /obj/item/melee/baton/stunsword //what it makes
var/list/fromitem = list(/obj/item/melee/baton, /obj/item/melee/baton/loaded) //what it needs
afterattack(obj/O, mob/user as mob)
if(istype(O, product))
to_chat(user,"<span class='warning'>[O] is already modified!")
else if(O.type in fromitem) //makes sure O is the right thing
var/obj/item/melee/baton/B = O
if(!B.cell) //checks for a powercell in the baton. If there isn't one, continue. If there is, warn the user to take it out
new product(usr.loc) //spawns the product
user.visible_message("<span class='warning'>[user] modifies [O]!","<span class='warning'>You modify the [O]!")
qdel(O) //Gets rid of the baton
qdel(src) //gets rid of the kit
else
to_chat(user,"<span class='warning'>Remove the powercell first!</span>") //We make this check because the stunsword starts without a battery.
/obj/item/ssword_kit/afterattack(obj/O, mob/user as mob)
if(istype(O, product))
to_chat(user,"<span class='warning'>[O] is already modified!")
return
if(O.type in fromitem) //makes sure O is the right thing
var/obj/item/melee/baton/B = O
if(!B.cell) //checks for a powercell in the baton. If there isn't one, continue. If there is, warn the user to take it out
new product(usr.loc) //spawns the product
user.visible_message("<span class='warning'>[user] modifies [O]!","<span class='warning'>You modify the [O]!")
qdel(O) //Gets rid of the baton
qdel(src) //gets rid of the kit
else
to_chat(user, "<span class='warning'> You can't modify [O] with this kit!</span>")
to_chat(user,"<span class='warning'>Remove the powercell first!</span>") //We make this check because the stunsword starts without a battery.
else
to_chat(user, "<span class='warning'> You can't modify [O] with this kit!</span>")
//Makeshift stun baton. Replacement for stun gloves.
/obj/item/melee/baton/cattleprod
+9
View File
@@ -73,6 +73,15 @@
/obj/item/tank/proc/populate_gas()
return
/obj/item/tank/DoRevenantThrowEffects(atom/target)
if(air_contents)
var/turf/open/location = get_turf(src)
if(istype(location))
location.assume_air(air_contents)
air_contents.clear()
SSair.add_to_active(location)
visible_message("<span class='warning'[src] leaks gas!")
/obj/item/tank/Destroy()
if(air_contents)
qdel(air_contents)
+7 -2
View File
@@ -57,6 +57,9 @@
else
item_state = "[initial(item_state)]"
/obj/item/weldingtool/DoRevenantThrowEffects(atom/target)
attack_self()
/obj/item/weldingtool/update_overlays()
. = ..()
if(change_icons)
@@ -208,12 +211,14 @@
//Switches the welder on
/obj/item/weldingtool/proc/switched_on(mob/user)
if(!status)
to_chat(user, "<span class='warning'>[src] can't be turned on while unsecured!</span>")
if(user)
to_chat(user, "<span class='warning'>[src] can't be turned on while unsecured!</span>")
return
welding = !welding
if(welding)
if(get_fuel() >= 1)
to_chat(user, "<span class='notice'>You switch [src] on.</span>")
if(user)
to_chat(user, "<span class='notice'>You switch [src] on.</span>")
playsound(loc, acti_sound, 50, 1)
force = 15
damtype = "fire"
+1
View File
@@ -531,6 +531,7 @@
pop_burst()
/obj/item/toy/snappop/Crossed(H as mob|obj)
. = ..()
if(ishuman(H) || issilicon(H)) //i guess carp and shit shouldn't set them off
var/mob/living/carbon/M = H
if(issilicon(H) || M.m_intent == MOVE_INTENT_RUN)
+2 -2
View File
@@ -62,7 +62,7 @@
return 1
var/mob/living/M = caller
if(!M.ventcrawler && M.mob_size != MOB_SIZE_TINY)
if(!(SEND_SIGNAL(M, COMSIG_CHECK_VENTCRAWL)) && M.mob_size != MOB_SIZE_TINY)
return 0
var/atom/movable/M = caller
if(M && M.pulling)
@@ -91,7 +91,7 @@
return 1
if(M.buckled && istype(M.buckled, /mob/living/simple_animal/bot/mulebot)) // mulebot passenger gets a free pass.
return 1
if(!M.lying && !M.ventcrawler && M.mob_size != MOB_SIZE_TINY) //If your not laying down, or a ventcrawler or a small creature, no pass.
if(!M.lying && !(SEND_SIGNAL(M, COMSIG_CHECK_VENTCRAWL)) && M.mob_size != MOB_SIZE_TINY) //If your not laying down, or a ventcrawler or a small creature, no pass.
return 0
return ..()
@@ -56,17 +56,17 @@
desc = "A direction sign, pointing out which way the Cafe is."
icon_state = "direction_cafe"
obj/structure/sign/directions/rooms
/obj/structure/sign/directions/rooms
name = "room"
desc = "Room numbers, helps others find you!"
icon_state = "roomnum"
obj/structure/sign/directions/dorms
/obj/structure/sign/directions/dorms
name = "dorm"
desc = "Dorm numbers, help others find you, or you find others."
icon_state = "dormnum"
obj/structure/sign/directions/cells
/obj/structure/sign/directions/cells
name = "room"
desc = "So the less fortunate amongst us know where they'll be staying."
icon_state = "cellnum"
+1 -1
View File
@@ -269,13 +269,13 @@
UnregisterSignal(source, COMSIG_MOVABLE_MOVED)
/obj/structure/table/rolling/Moved(atom/OldLoc, Dir)
. = ..()
for(var/mob/M in OldLoc.contents)//Kidnap everyone on top
M.forceMove(loc)
for(var/x in attached_items)
var/atom/movable/AM = x
if(!AM.Move(loc))
RemoveItemFromTable(AM, AM.loc)
return TRUE
/*
* Glass tables
@@ -126,12 +126,13 @@
if(current_tube == null)
setDir(next_dir)
Move(get_step(loc, dir), dir) // Allow collisions when leaving the tubes.
Move(get_step(loc, dir), dir, DELAY_TO_GLIDE_SIZE(exit_delay)) // Allow collisions when leaving the tubes.
break
last_delay = current_tube.enter_delay(src, next_dir)
sleep(last_delay)
setDir(next_dir)
set_glide_size(DELAY_TO_GLIDE_SIZE(last_delay + exit_delay))
forceMove(next_loc) // When moving from one tube to another, skip collision and such.
density = current_tube.density
+2
View File
@@ -56,6 +56,7 @@
animate(src, alpha = initial(alpha), time = time_between_triggers)
/obj/structure/trap/Crossed(atom/movable/AM)
. = ..()
if(last_trigger + time_between_triggers > world.time)
return
// Don't want the traps triggered by sparks, ghosts or projectiles.
@@ -67,6 +68,7 @@
return
if(M.anti_magic_check())
flare()
return
if(charges <= 0)
return
flare()