Merge remote-tracking branch 'origin/master' into motivation
This commit is contained in:
@@ -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())
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user