Merge remote-tracking branch 'upstream/master' into just-defibrillator-things

This commit is contained in:
E-MonaRhg
2021-08-14 17:42:06 +02:00
206 changed files with 19222 additions and 23178 deletions
+1 -1
View File
@@ -287,7 +287,7 @@
A.Grant(S)
var/list/mob/dead/observer/candidates = SSghost_spawns.poll_candidates("Do you want to play as a pyroclastic anomaly slime?", ROLE_SENTIENT, FALSE, 100, source = S, role_cleanname = "pyroclastic anomaly slime")
if(LAZYLEN(candidates))
if(length(candidates) && !QDELETED(S))
var/mob/dead/observer/chosen = pick(candidates)
S.key = chosen.key
S.mind.special_role = SPECIAL_ROLE_PYROCLASTIC_SLIME
+9 -8
View File
@@ -67,6 +67,11 @@
/obj/effect/mapping_helpers/no_lava
icon_state = "no_lava"
/obj/effect/mapping_helpers/no_lava/New()
var/turf/T = get_turf(src)
T.flags |= NO_LAVA_GEN
..()
/obj/effect/mapping_helpers/airlock
layer = DOOR_HELPER_LAYER
@@ -78,13 +83,9 @@
if(!mapload)
log_world("### MAP WARNING, [src] spawned outside of mapload!")
return
var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in src.loc
if(airlock)
airlock.unres_sides ^= dir
var/obj/machinery/door/door = locate(/obj/machinery/door) in loc
if(door)
door.unres_sides ^= dir
else
log_world("### MAP WARNING, [src] failed to find an airlock at [AREACOORD(src)]")
..()
/obj/effect/mapping_helpers/no_lava/New()
var/turf/T = get_turf(src)
T.flags |= NO_LAVA_GEN
. = ..()
..()
+13 -3
View File
@@ -1,4 +1,6 @@
//generic procs copied from obj/effect/alien
#define SPIDER_SOFT_CAP 30
#define SPIDER_HARD_CAP 40
/obj/structure/spider
name = "web"
desc = "it's stringy and sticky"
@@ -67,7 +69,11 @@
START_PROCESSING(SSobj, src)
/obj/structure/spider/eggcluster/process()
amount_grown += rand(0,2)
if(SSmobs.giant_spiders > SPIDER_SOFT_CAP) //eggs gonna chill out until there is less spiders
return
amount_grown += rand(0, 2)
if(amount_grown >= 100)
var/num = rand(3, 12)
for(var/i in 1 to num)
@@ -75,7 +81,7 @@
S.faction = faction.Copy()
S.master_commander = master_commander
if(player_spiders)
S.player_spiders = 1
S.player_spiders = TRUE
qdel(src)
/obj/structure/spider/spiderling
@@ -168,9 +174,13 @@
if(isturf(loc))
amount_grown += rand(0,2)
if(amount_grown >= 100)
if(SSmobs.giant_spiders > SPIDER_HARD_CAP)
qdel(src)
return
if(!grow_as)
grow_as = pick(typesof(/mob/living/simple_animal/hostile/poison/giant_spider))
var/mob/living/simple_animal/hostile/poison/giant_spider/S = new grow_as(loc)
SSmobs.giant_spiders++
S.faction = faction.Copy()
S.master_commander = master_commander
if(player_spiders && !selecting_player)
@@ -178,7 +188,7 @@
spawn()
var/list/candidates = SSghost_spawns.poll_candidates("Do you want to play as a giant spider?", ROLE_GSPIDER, TRUE, source = S)
if(candidates.len)
if(length(candidates) && !QDELETED(S))
var/mob/C = pick(candidates)
if(C)
S.key = C.key
@@ -43,14 +43,14 @@
/obj/effect/temp_visual/ratvar/window
icon_state = "ratvarwindowglow"
layer = ABOVE_OBJ_LAYER
layer = ABOVE_WINDOW_LAYER
/obj/effect/temp_visual/ratvar/window/single
icon_state = "ratvarwindowglow_s"
/obj/effect/temp_visual/ratvar/gear
icon_state = "ratvargearglow"
layer = BELOW_OBJ_LAYER
layer = ABOVE_OBJ_LAYER
/obj/effect/temp_visual/ratvar/grille
icon_state = "ratvargrilleglow"
+10
View File
@@ -1,3 +1,13 @@
/**
* Will cause an EMP on the given epicenter.
* This proc can sleep depending on the affected objects. So assume it sleeps!
*
* epicenter - The center of the EMP. Can be an atom, as long as the given atom is on a turf (in)directly
* heavy_range - The max distance from the epicenter where objects will be get heavy EMPed
* light_range - The max distance from the epicenter where objects will get light EMPed
* log - Whether or not this action should be logged or not. Will use the cause if provided
* cause - The cause of the EMP. Used for the logging
*/
/proc/empulse(turf/epicenter, heavy_range, light_range, log = FALSE, cause = null)
if(!epicenter) return
+3 -2
View File
@@ -329,5 +329,6 @@
..()
/obj/item/paicard/extinguish_light()
pai.extinguish_light()
set_light(0)
if(pai)
pai.extinguish_light()
set_light(0)
@@ -1,6 +1,7 @@
/obj/item/painter
name = "modular painter"
icon = 'icons/obj/painting.dmi'
icon_state = "floor_painter"
usesound = 'sound/effects/spray2.ogg'
flags = CONDUCT | NOBLUDGEON
w_class = WEIGHT_CLASS_SMALL
@@ -307,12 +307,18 @@
icon_state = "com_headset_alt"
item_state = "com_headset_alt"
/obj/item/radio/headset/ert/alt/solgov
name = "\improper Trans-Solar Federation Marine's bowman headset"
/obj/item/radio/headset/ert/alt/commander
name = "ERT commander's bowman headset"
desc = "The headset of the boss. Protects ears from flashbangs. Can transmit even if telecomms are down."
requires_tcomms = FALSE
instant = TRUE
/obj/item/radio/headset/ert/alt/commander/solgov
name = "\improper Trans-Solar Federation Lieutenant's bowman headset"
/obj/item/radio/headset/centcom
name = "centcom officer's bowman headset"
desc = "The headset of final authority. Protects ears from flashbangs. Can transmit even if telecomms are down."
@@ -2,6 +2,7 @@
name = "station intercom (General)"
desc = "Talk through this."
icon_state = "intercom"
layer = ABOVE_WINDOW_LAYER
anchored = 1
w_class = WEIGHT_CLASS_BULKY
canhear_range = 2
+8 -8
View File
@@ -197,15 +197,15 @@
to_chat(usr, "<span class='warning'>You haven't got enough [src] to build \the [R.title]!</span>")
return FALSE
if(R.window_checks && !valid_window_location(usr.loc, usr.dir))
if(R.window_checks && !valid_window_location(get_turf(src), usr.dir))
to_chat(usr, "<span class='warning'>\The [R.title] won't fit here!</span>")
return FALSE
if(R.one_per_turf && (locate(R.result_type) in usr.drop_location()))
if(R.one_per_turf && (locate(R.result_type) in get_turf(src)))
to_chat(usr, "<span class='warning'>There is another [R.title] here!</span>")
return FALSE
if(R.on_floor && !istype(usr.drop_location(), /turf/simulated))
if(R.on_floor && !istype(get_turf(src), /turf/simulated))
to_chat(usr, "<span class='warning'>\The [R.title] must be constructed on the floor!</span>")
return FALSE
@@ -215,13 +215,13 @@
if(!is_level_reachable(usr.z))
to_chat(usr, "<span class='warning'>The energies of this place interfere with the metal shaping!</span>")
return
if(locate(/obj/structure/cult) in usr.drop_location())
if(locate(/obj/structure/cult) in get_turf(src))
to_chat(usr, "<span class='warning'>There is a structure here!</span>")
return FALSE
if(R.time)
to_chat(usr, "<span class='notice'>Building [R.title] ...</span>")
if(!do_after(usr, R.time, target = usr))
to_chat(usr, "<span class='notice'>Building [R.title]...</span>")
if(!do_after(usr, R.time, target = loc))
return 0
if(get_amount() < R.req_amount * multiplier)
@@ -229,9 +229,9 @@
var/atom/O
if(R.max_res_amount > 1) //Is it a stack?
O = new R.result_type(usr.drop_location(), R.res_amount * multiplier)
O = new R.result_type(get_turf(src), R.res_amount * multiplier)
else
O = new R.result_type(usr.drop_location())
O = new R.result_type(get_turf(src))
O.setDir(usr.dir)
use(R.req_amount * multiplier)
updateUsrDialog()
+282
View File
@@ -0,0 +1,282 @@
//Items for nuke theft, supermatter theft traitor objective
// STEALING THE NUKE
//the nuke core, base item
/obj/item/nuke_core
name = "plutonium core"
desc = "Extremely radioactive. Wear goggles."
icon = 'icons/obj/nuke_tools.dmi'
icon_state = "plutonium_core"
item_state = "plutoniumcore"
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
flags_2 = RAD_NO_CONTAMINATE_2 //Don't have the item itself become irradiated when it makes radiation.
var/pulse = 0
var/cooldown = 0
var/pulseicon = "plutonium_core_pulse"
/obj/item/nuke_core/Initialize()
. = ..()
START_PROCESSING(SSobj, src)
/obj/item/nuke_core/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/nuke_core/attackby(obj/item/nuke_core_container/container, mob/user)
if(istype(container))
container.load(src, user)
else
return ..()
/obj/item/nuke_core/process()
if(cooldown < world.time - 6 SECONDS)
cooldown = world.time
flick(pulseicon, src)
radiation_pulse(src, 400, 2)
/obj/item/nuke_core/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is rubbing [src] against [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return TOXLOSS
/obj/item/nuke_core/plutonium //The steal objective, so it doesnt mess with the SM sliver on pinpointers and objectives
//nuke core box, for carrying the core
/obj/item/nuke_core_container
name = "nuke core container"
desc = "A solid container for radioactive objects."
icon = 'icons/obj/nuke_tools.dmi'
icon_state = "core_container_empty"
item_state = "metal"
var/obj/item/nuke_core/plutonium/core
/obj/item/nuke_core_container/Destroy()
QDEL_NULL(core)
return ..()
/obj/item/nuke_core_container/proc/load(obj/item/nuke_core/plutonium/new_core, mob/user)
if(core || !istype(new_core))
return
new_core.forceMove(src)
core = new_core
icon_state = "core_container_loaded"
to_chat(user, "<span class='warning'>Container is sealing...</span>")
addtimer(CALLBACK(src, .proc/seal), 10 SECONDS)
/obj/item/nuke_core_container/proc/seal()
if(!QDELETED(core))
STOP_PROCESSING(SSobj, core)
icon_state = "core_container_sealed"
playsound(src, 'sound/items/deconstruct.ogg', 60, TRUE)
if(ismob(loc))
to_chat(loc, "<span class='warning'>[src] is permanently sealed, [core]'s radiation is contained.</span>")
/obj/item/nuke_core_container/attackby(obj/item/nuke_core/plutonium/core, mob/user)
if(!istype(core))
return ..()
if(!user.drop_item())
to_chat(user, "<span class='warning'>[core] is stuck to your hand!</span>")
return
else
load(core, user)
/obj/item/paper/guides/antag/nuke_instructions
info = "How to break into a Nanotrasen nuclear device and remove its plutonium core:<br>\
<ul>\
<li>Use a screwdriver with a very thin tip (provided) to unscrew the terminal's front panel.</li>\
<li>Dislodge and remove the front panel with a crowbar.</li>\
<li>Cut the inner metal plate with a welding tool.</li>\
<li>Pry off the inner plate with a crowbar to expose the radioactive core.</li>\
<li>Pull the core out of the nuclear device. </li>\
<li>Put the core in the provided container, which will take some time to seal. </li>\
<li>???</li>\
</ul>"
// STEALING SUPERMATTER.
/obj/item/paper/guides/antag/supermatter_sliver
info = "How to safely extract a supermatter sliver:<br>\
<ul>\
<li>Approach an active supermatter crystal with radiation shielded personal protective equipment. DO NOT MAKE PHYSICAL CONTACT.</li>\
<li>Use a supermatter scalpel (provided) to slice off a sliver of the crystal.</li>\
<li>Use supermatter extraction tongs (also provided) to safely pick up the sliver you sliced off.</li>\
<li>Physical contact of any object with the sliver will dust the object, as well as yourself.</li>\
<li>Use the tongs to place the sliver into the provided container, which will take some time to seal.</li>\
<li>Get the hell out before the crystal delaminates.</li>\
<li>???</li>\
</ul>"
/obj/item/nuke_core/supermatter_sliver
name = "supermatter sliver"
desc = "A tiny, highly volatile sliver of a supermatter crystal. Do not handle without protection!"
icon_state = "supermatter_sliver"
pulseicon = "supermatter_sliver_pulse"
/obj/item/nuke_core/supermatter_sliver/attack_tk(mob/user) // no TK dusting memes
return
/obj/item/nuke_core/supermatter_sliver/can_be_pulled(user) // no drag memes
return FALSE
/obj/item/nuke_core/supermatter_sliver/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/retractor/supermatter))
var/obj/item/retractor/supermatter/tongs = I
if(tongs.sliver)
to_chat(user, "<span class='warning'>[tongs] are already holding a supermatter sliver!</span>")
return FALSE
forceMove(tongs)
tongs.sliver = src
tongs.icon_state = "supermatter_tongs_loaded"
tongs.item_state = "supermatter_tongs_loaded"
to_chat(user, "<span class='notice'>You carefully pick up [src] with [tongs].</span>")
else if(istype(I, /obj/item/scalpel/supermatter) || istype(I, /obj/item/nuke_core_container/supermatter)) // we don't want it to dust
return
else
to_chat(user, "<span class='danger'>As it touches [src], both [src] and [I] burst into dust!</span>")
radiation_pulse(user, 100)
playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE)
qdel(I)
qdel(src)
/obj/item/nuke_core/supermatter_sliver/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
if(!isliving(hit_atom))
return ..()
var/mob/living/victim = hit_atom
if(victim.incorporeal_move || victim.status_flags & GODMODE) //try to keep this in sync with supermatter's consume fail conditions
return ..()
if(throwingdatum?.thrower)
var/mob/user = throwingdatum.thrower
add_attack_logs(user, victim, "[victim] consumed by [src] thrown by [user] ")
message_admins("[src] has consumed [key_name_admin(victim)] [ADMIN_JMP(src)], thrown by [key_name_admin(user)].")
investigate_log("has consumed [key_name(victim)], thrown by [key_name(user)]", "supermatter")
else
message_admins("[src] has consumed [key_name_admin(victim)] [ADMIN_JMP(src)] via throw impact.")
investigate_log("has consumed [key_name(victim)] via throw impact.", "supermatter")
victim.visible_message("<span class='danger'>As [victim] is hit by [src], both flash into dust and silence fills the room...</span>",
"<span class='userdanger'>You're hit by [src] and everything suddenly goes silent.\n[src] flashes into dust, and soon as you can register this, you do as well.</span>",
"<span class='hear'>Everything suddenly goes silent.</span>")
victim.dust()
radiation_pulse(src, 500, 2)
playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE)
qdel(src)
/obj/item/nuke_core/supermatter_sliver/pickup(mob/living/user)
..()
if(!isliving(user) || user.status_flags & GODMODE) //try to keep this in sync with supermatter's consume fail conditions
return FALSE
user.visible_message("<span class='danger'>[user] reaches out and tries to pick up [src]. [user.p_their()] body starts to glow and bursts into flames before flashing into dust!</span>",
"<span class='userdanger'>You reach for [src] with your hands. That was dumb.</span>",
"<span class='hear'>Everything suddenly goes silent.</span>")
radiation_pulse(user, 500, 2)
playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE)
user.dust()
/obj/item/nuke_core_container/supermatter
name = "supermatter bin"
desc = "A tiny receptacle that releases an inert hyper-noblium mix upon sealing, allowing a sliver of a supermatter crystal to be safely stored."
var/obj/item/nuke_core/supermatter_sliver/sliver
/obj/item/nuke_core_container/supermatter/Destroy()
QDEL_NULL(sliver)
return ..()
/obj/item/nuke_core_container/supermatter/load(obj/item/retractor/supermatter/I, mob/user)
if(!istype(I) || !I.sliver)
return
I.sliver.forceMove(src)
sliver = I.sliver
I.sliver = null
I.icon_state = "supermatter_tongs"
I.item_state = "supermatter_tongs"
icon_state = "supermatter_container_loaded"
to_chat(user, "<span class='warning'>Container is sealing...</span>")
addtimer(CALLBACK(src, .proc/seal), 10 SECONDS)
/obj/item/nuke_core_container/supermatter/seal()
if(!QDELETED(sliver))
STOP_PROCESSING(SSobj, sliver)
icon_state = "supermatter_container_sealed"
playsound(src, 'sound/items/deconstruct.ogg', 60, TRUE)
if(ismob(loc))
to_chat(loc, "<span class='warning'>[src] is permanently sealed, [sliver] is safely contained.</span>")
/obj/item/nuke_core_container/supermatter/attackby(obj/item/retractor/supermatter/tongs, mob/user)
if(istype(tongs))
//try to load shard into core
load(tongs, user)
else
return ..()
/obj/item/scalpel/supermatter
name = "supermatter scalpel"
desc = "A scalpel with a fragile tip of condensed hyper-noblium gas, searingly cold to the touch, that can safely shave a sliver off a supermatter crystal."
icon = 'icons/obj/nuke_tools.dmi'
icon_state = "supermatter_scalpel"
toolspeed = 0.5
damtype = BURN
usesound = 'sound/weapons/bladeslice.ogg'
var/uses_left
/obj/item/scalpel/supermatter/Initialize()
. = ..()
uses_left = rand(2, 4)
/obj/item/retractor/supermatter
name = "supermatter extraction tongs"
desc = "A pair of tongs made from condensed hyper-noblium gas, searingly cold to the touch, that can safely grip a supermatter sliver."
icon = 'icons/obj/nuke_tools.dmi'
icon_state = "supermatter_tongs"
lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items_righthand.dmi'
item_state = "supermatter_tongs"
toolspeed = 0.75
damtype = BURN
var/obj/item/nuke_core/supermatter_sliver/sliver
/obj/item/retractor/supermatter/Destroy()
QDEL_NULL(sliver)
return ..()
/obj/item/retractor/supermatter/afterattack(atom/O, mob/user, proximity)
. = ..()
if(!sliver)
return
if(proximity && ismovable(O) && O != sliver)
Consume(O, user)
/obj/item/retractor/supermatter/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) // no instakill supermatter javelins
if(sliver)
sliver.forceMove(loc)
visible_message("<span class='notice'>[sliver] falls out of [src] as it hits the ground.</span>")
sliver = null
icon_state = "supermatter_tongs"
item_state = "supermatter_tongs"
return ..()
/obj/item/retractor/supermatter/proc/Consume(atom/movable/AM, mob/living/user)
if(ismob(AM))
if(!isliving(AM))
return
var/mob/living/victim = AM
if(victim.incorporeal_move || victim.status_flags & GODMODE) //try to keep this in sync with supermatter's consume fail conditions
return
victim.dust()
message_admins("[src] has consumed [key_name_admin(victim)] [ADMIN_JMP(src)].")
investigate_log("has irradiated [key_name(victim)].", "supermatter")
else if(istype(AM, /obj/singularity))
return
else
investigate_log("has consumed [AM].", "supermatter")
qdel(AM)
if(user)
add_attack_logs(user, AM, "[AM] and [user] consumed by melee attack with [src] by [user]")
user.visible_message("<span class='danger'>As [user] touches [AM] with [src], both flash into dust and silence fills the room...</span>",
"<span class='userdanger'>You touch [AM] with [src], and everything suddenly goes silent.\n[AM] and [sliver] flash into dust, and soon as you can register this, you do as well.</span>",
"<span class='hear'>Everything suddenly goes silent.</span>")
user.dust()
radiation_pulse(src, 500, 2)
playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE)
QDEL_NULL(sliver)
@@ -27,6 +27,7 @@
desc = "A screwdriver with an ultra thin tip."
icon_state = "screwdriver_nuke"
toolspeed = 0.5
random_color = FALSE
/obj/item/screwdriver/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is stabbing [src] into [user.p_their()] [pick("temple", "heart")]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
@@ -47,7 +47,7 @@
a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm")
qdel(src)
if("emp")
var/name = prob(50) ? t.name : pick(GLOB.teleportlocs)
var/name = prob(50) ? t.name : pick(SSmapping.teleportlocs)
a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm")
else
a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm")
@@ -4,6 +4,7 @@
icon_state = "explosive"
origin_tech = "materials=2;combat=3;biotech=4;syndicate=4"
actions_types = list(/datum/action/item_action/hands_free/activate/always)
var/detonating = FALSE
var/weak = 2
var/medium = 0.8
var/heavy = 0.4
@@ -26,16 +27,20 @@
activate("death")
/obj/item/implant/explosive/activate(cause)
if(!cause || !imp_in) return 0
if(!cause || !imp_in)
return FALSE
if(cause == "action_button" && alert(imp_in, "Are you sure you want to activate your microbomb implant? This will cause you to explode!", "Microbomb Implant Confirmation", "Yes", "No") != "Yes")
return 0
return FALSE
if(detonating)
return FALSE
heavy = round(heavy)
medium = round(medium)
weak = round(weak)
to_chat(imp_in, "<span class='notice'>You activate your microbomb implant.</span>")
detonating = TRUE
to_chat(imp_in, "<span class='danger'>You activate your microbomb implant.</span>")
//If the delay is short, just blow up already jeez
if(delay <= 7)
explosion(src,heavy,medium,weak,weak, flame_range = weak)
explosion(src, heavy, medium, weak, weak, flame_range = weak)
if(imp_in)
imp_in.gib()
qdel(src)
@@ -58,7 +58,7 @@
/obj/item/implant/emp/activate()
uses--
empulse(imp_in, 3, 5, 1)
INVOKE_ASYNC(GLOBAL_PROC, .proc/empulse, get_turf(imp_in), 3, 5, 1)
if(!uses)
qdel(src)
@@ -61,6 +61,9 @@
return
if(istype(W, /obj/item))
var/obj/item/IW = W
if(IW.flags & (ABSTRACT | NODROP | DROPDEL))
to_chat(user, "<span class='warning'>You can't put [IW] into [src]!</span>")
return
if((loadedWeightClass + IW.w_class) > maxWeightClass)
to_chat(user, "<span class='warning'>\The [IW] won't fit into \the [src]!</span>")
return
+2 -2
View File
@@ -47,12 +47,12 @@
var/A
A = input(user, "Area to jump to", "BOOYEA", A) as null|anything in GLOB.teleportlocs
A = input(user, "Area to jump to", "BOOYEA", A) as null|anything in SSmapping.teleportlocs
if(!A)
return
var/area/thearea = GLOB.teleportlocs[A]
var/area/thearea = SSmapping.teleportlocs[A]
if(user.stat || user.restrained())
return
@@ -584,3 +584,9 @@
name = "emergency response team janitor backpack"
desc = "A spacious backpack with lots of pockets, worn by janitorial members of a Nanotrasen Emergency Response Team."
icon_state = "ert_janitor"
//Solgov
/obj/item/storage/backpack/ert/solgov
name = "\improper TSF marine backpack"
desc = "A spacious backpack with lots of pockets, worn by marines of the Trans-Solar Federation."
icon_state = "ert_solgov"
@@ -12,9 +12,9 @@
/// No message on putting items in.
var/silent = FALSE
/// List of objects which this item can store (if set, it can't store anything else)
var/list/can_hold = new/list()
var/list/can_hold = list()
/// List of objects which this item can't store (in effect only if can_hold isn't set)
var/list/cant_hold = new/list()
var/list/cant_hold = list()
/// Max size of objects that this object can store (in effect only if can_hold isn't set)
var/max_w_class = WEIGHT_CLASS_SMALL
/// The sum of the w_classes of all the items in this storage item.
@@ -42,6 +42,9 @@
/// How much of the stack item do you get.
var/foldable_amt = 0
/// Lazy list of mobs which are currently viewing the storage inventory.
var/list/mobs_viewing
/obj/item/storage/Initialize(mapload)
. = ..()
can_hold = typecacheof(can_hold)
@@ -73,6 +76,15 @@
closer.plane = ABOVE_HUD_PLANE
orient2hud()
/obj/item/storage/Destroy()
for(var/obj/O in contents)
O.mouse_opacity = initial(O.mouse_opacity)
QDEL_NULL(boxes)
QDEL_NULL(closer)
LAZYCLEARLIST(mobs_viewing)
return ..()
/obj/item/storage/MouseDrop(obj/over_object)
if(!ismob(usr)) //so monkeys can take off their backpacks -- Urist
return
@@ -177,11 +189,13 @@
user.client.screen += closer
user.client.screen += contents
user.s_active = src
LAZYADDOR(mobs_viewing, user)
/**
* Hides the current container interface from `user`.
*/
/obj/item/storage/proc/hide_from(mob/user)
LAZYREMOVE(mobs_viewing, user) // Remove clientless mobs too
if(!user.client)
return
user.client.screen -= boxes
@@ -190,6 +204,16 @@
if(user.s_active == src)
user.s_active = null
/**
* Checks all mobs currently viewing the storage inventory, and hides it if they shouldn't be able to see it.
*/
/obj/item/storage/proc/update_viewers()
for(var/_M in mobs_viewing)
var/mob/M = _M
if(!QDELETED(M) && M.s_active == src && (M in range(1, loc)))
continue
hide_from(M)
/obj/item/storage/proc/open(mob/user)
if(use_sound)
playsound(loc, use_sound, 50, TRUE, -5)
@@ -374,6 +398,12 @@
prevent_warning = TRUE
I.forceMove(src)
I.on_enter_storage(src)
for(var/_M in mobs_viewing)
var/mob/M = _M
if((M.s_active == src) && M.client)
M.client.screen += I
if(usr)
if(usr.client && usr.s_active != src)
usr.client.screen -= I
@@ -412,7 +442,8 @@
var/obj/item/storage/fancy/F = src
F.update_icon(TRUE)
for(var/mob/M in range(1, loc))
for(var/_M in mobs_viewing)
var/mob/M = _M
if((M.s_active == src) && M.client)
M.client.screen -= I
@@ -498,6 +529,10 @@
close(M)
add_fingerprint(user)
/obj/item/storage/equipped(mob/user, slot, initial)
. = ..()
update_viewers()
/obj/item/storage/attack_ghost(mob/user)
if(isobserver(user))
// Revenants don't get to play with the toys.
@@ -539,14 +574,6 @@
/obj/item/storage/proc/populate_contents()
return // Override
/obj/item/storage/Destroy()
for(var/obj/O in contents)
O.mouse_opacity = initial(O.mouse_opacity)
QDEL_NULL(boxes)
QDEL_NULL(closer)
return ..()
/obj/item/storage/emp_act(severity)
..()
for(var/I in contents)
@@ -309,3 +309,24 @@ To apply, hold the injector a short distance away from the outer thigh before ap
new /obj/item/reagent_containers/syringe/capulettium_plus(src)
new /obj/item/reagent_containers/syringe/sarin(src)
new /obj/item/reagent_containers/syringe/pancuronium(src)
/obj/item/storage/box/syndie_kit/nuke
name = "box" //Bit of stealth, since you spawn with it
desc = "It's just an ordinary box."
icon_state = "box"
/obj/item/storage/box/syndie_kit/nuke/populate_contents()
new /obj/item/screwdriver/nuke(src)
new /obj/item/nuke_core_container(src)
new /obj/item/paper/guides/antag/nuke_instructions(src)
/obj/item/storage/box/syndie_kit/supermatter
name = "box"
desc = "It's just an ordinary box."
icon_state = "box"
/obj/item/storage/box/syndie_kit/supermatter/populate_contents()
new /obj/item/scalpel/supermatter(src)
new /obj/item/retractor/supermatter(src)
new /obj/item/nuke_core_container/supermatter(src)
new /obj/item/paper/guides/antag/supermatter_sliver(src)
@@ -71,18 +71,18 @@
icon_opened = "fireclosetopen"
/obj/structure/closet/firecloset/populate_contents()
new /obj/item/extinguisher(src)
new /obj/item/clothing/suit/fire/firefighter(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/tank/internals/oxygen/red(src)
new /obj/item/extinguisher(src)
new /obj/item/clothing/head/hardhat/red(src)
/obj/structure/closet/firecloset/full/populate_contents()
new /obj/item/extinguisher(src)
new /obj/item/clothing/suit/fire/firefighter(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/flashlight(src)
new /obj/item/tank/internals/oxygen/red(src)
new /obj/item/extinguisher(src)
new /obj/item/clothing/head/hardhat/red(src)
+7 -6
View File
@@ -41,6 +41,7 @@
trigger_alarm()
emagged = TRUE
toggle_lock()
/obj/structure/displaycase/examine(mob/user)
. = ..()
@@ -110,12 +111,12 @@
/obj/structure/displaycase/attackby(obj/item/I, mob/user, params)
if(I.GetID() && !broken && openable)
if(allowed(user) || emagged)
to_chat(user, "<span class='notice'>You [open ? "close":"open"] [src].</span>")
toggle_lock(user)
to_chat(user, "<span class='notice'>You [open ? "close":"open"] [src].</span>")
toggle_lock()
else
to_chat(user, "<span class='warning'>Access denied.</span>")
to_chat(user, "<span class='warning'>Access denied.</span>")
else if(open && !showpiece)
if(user.drop_item())
if(!(I.flags & (ABSTRACT | DROPDEL)) && user.drop_item())
I.forceMove(src)
showpiece = I
to_chat(user, "<span class='notice'>You put [I] on display</span>")
@@ -151,14 +152,14 @@
if(!I.use_tool(src, user, 20, volume = I.tool_volume))
return
to_chat(user, "<span class='notice'>You [open ? "close":"open"] [src].</span>")
toggle_lock(user)
toggle_lock()
/obj/structure/displaycase/welder_act(mob/user, obj/item/I)
. = TRUE
if(default_welder_repair(user, I))
broken = FALSE
/obj/structure/displaycase/proc/toggle_lock(mob/user)
/obj/structure/displaycase/proc/toggle_lock()
open = !open
update_icon()
+1 -1
View File
@@ -28,7 +28,7 @@
if(GIRDER_DISASSEMBLED)
. += "<span class='notice'>[src] is disassembled! You probably shouldn't be able to see this examine message.</span>"
/obj/structre/girder/detailed_examine()
/obj/structure/girder/detailed_examine()
return "Use metal sheets on this to build a normal wall. Adding plasteel instead will make a reinforced wall.<br>\
A false wall can be made by using a crowbar on this girder, and then adding metal or plasteel.<br>\
You can dismantle the girder with a wrench."
+8 -1
View File
@@ -46,9 +46,16 @@
/obj/structure/inflatable/CanAtmosPass(turf/T)
return !density
/obj/structure/inflatable/attack_hand(mob/user as mob)
/obj/structure/inflatable/attack_hand(mob/user)
add_fingerprint(user)
/obj/structure/inflatable/attackby(obj/item/I, mob/living/user, params)
if(I.sharp || is_type_in_typecache(I, GLOB.pointed_types))
user.do_attack_animation(src, used_item = I)
deconstruct(FALSE)
return FALSE
return ..()
/obj/structure/inflatable/AltClick()
if(usr.stat || usr.restrained())
return
@@ -203,6 +203,7 @@
windoor.req_one_access = electronics.selected_accesses
else
windoor.req_access = electronics.selected_accesses
windoor.unres_sides = electronics.unres_access_from
windoor.electronics = src.electronics
electronics.forceMove(windoor)
electronics = null
+5 -9
View File
@@ -702,21 +702,17 @@
reinf = FALSE
var/made_glow = FALSE
/obj/structure/window/reinforced/clockwork/Initialize(mapload, direct)
. = ..()
if(fulltile)
made_glow = TRUE
if(fulltile)
new /obj/effect/temp_visual/ratvar/window(get_turf(src))
/obj/structure/window/reinforced/clockwork/spawnDebris(location)
. = list()
. += new /obj/item/stack/tile/brass(location, (fulltile ? 2 : 1))
/obj/structure/window/reinforced/clockwork/setDir(direct)
if(!made_glow)
var/obj/effect/E = new /obj/effect/temp_visual/ratvar/window/single(get_turf(src))
E.setDir(direct)
if(fulltile)
new /obj/effect/temp_visual/ratvar/window(get_turf(src))
else
var/obj/effect/E = new /obj/effect/temp_visual/ratvar/window/single(get_turf(src))
E.setDir(direct)
made_glow = TRUE
..()